【激突】関数型言語 VS オブジェクト指向言語
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/03/10(土) 06:35:55.71一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
0153デフォルトの名無しさん
2012/03/17(土) 22:24:01.370154デフォルトの名無しさん
2012/03/17(土) 22:37:38.40それは関数型言語特有の機能かと言うと違う訳で、最近の言語なら内包表記か、似た機能サポートしてるっしょ
(pythonも内包表記サポートしてるし、C#も似た機能有ったの見かけた)
0155デフォルトの名無しさん
2012/03/17(土) 22:46:21.640156デフォルトの名無しさん
2012/03/17(土) 23:23:34.860157デフォルトの名無しさん
2012/03/17(土) 23:28:51.93多分、コード自体はどっちも大して変わらんはずなのに
0158デフォルトの名無しさん
2012/03/17(土) 23:43:19.86(1..n).to_a.permutation(n){|a|p a}
0159デフォルトの名無しさん
2012/03/17(土) 23:48:37.10おまえのCPUはハードウェアでガベコレしてんのか。
0160デフォルトの名無しさん
2012/03/18(日) 00:08:33.09掃除されると思ってる先輩がいるんだが
どうしたらいい?
0161デフォルトの名無しさん
2012/03/18(日) 00:13:34.62待て待てw
組込みメソッド使ったら意味無いだろ
それを言ったら、Haskellも
import Data.List
parmutations [1..3]
で良いわい
0162デフォルトの名無しさん
2012/03/18(日) 00:17:41.67JavaScriptでは、nullとundefinedがありますが
これと同じ物を関数型言語で実装してください。
0163デフォルトの名無しさん
2012/03/18(日) 00:26:07.90OOPLで書くっつーても、それが単に数値でしかない以上
単なる手続き型のコードが最適解になるからなあ
限りなくOOP的なアプローチを取ると冗長だろうし
0164デフォルトの名無しさん
2012/03/18(日) 00:31:26.19出せばいいんだよ。
たとえば、ドラッグアンドドロップを実装するとかさ。
0165デフォルトの名無しさん
2012/03/18(日) 00:35:30.88組み込みメソッドはプリミティブとして定義されているのだから、
使ってもいいんじゃね?
そのHaskellの例だと、import Data.List はプリミティブではないから、
明らかに反則だけどね
どこで線を引くかで、このスレでローカルルールが必要になると思うけど
0166デフォルトの名無しさん
2012/03/18(日) 00:38:41.98そんなことを言ったら、PHP最強ってことになるぞw
関数型言語で、ウェブサイトから
データを取ってきて表示してください。
<?php echo file_get_contents('http://www.example.com/');
完了w
0167デフォルトの名無しさん
2012/03/18(日) 00:39:30.13手続き型のコードでもいいんじゃね?それが最適解であるのなら....
実際にアンチ関数型スレでは、素数生成についてジェネレータを使った
PythonとSmalltalkのコードが示されていたけど、誰からも文句は出なかったし
0168デフォルトの名無しさん
2012/03/18(日) 00:43:21.47アンカを間違えていまいか?
そういったライブラリ利用があるから使っていいのはプリミティブまでにしようぜ、
というのが>>165の主旨なんだけど
0169デフォルトの名無しさん
2012/03/18(日) 01:01:14.18Cだと文字の表示すら出来んがな
0170デフォルトの名無しさん
2012/03/18(日) 01:18:29.30それどころかHaskellだって、もしリストの畳み込み処理が必要になったら、
組み込み関数のfoldlは使えず、いちいち
foldl _ v [] = v
foldl f v (x:xs) = foldl f (f v x) xs
と書かなければ反則扱いされてしまう(>>39)
だから、プリミティブまでは使ってもいいんじゃね?というのが>>165の主旨
また、ライブラリの利用は禁止とまでは言わないが、減点の対象になるだろうね(>>161)
0171デフォルトの名無しさん
2012/03/18(日) 01:59:34.90Haskell vs. Python の仁義無き闘いはマダー? チン、チン
0172デフォルトの名無しさん
2012/03/18(日) 02:03:26.75んじゃ俺は再帰で…
def perm(ns)
return [] if ns.empty?
return [ns] if ns.size == 1
ns.inject([]){|r,n| r + perm(ns.reject{|x| x == n }).map{|xs| [n] + xs }}
end
n = 3
p perm((1..n).to_a)
0173デフォルトの名無しさん
2012/03/18(日) 02:13:07.05(と言うか、自分が知らんだけで、ruby/pythonでも組み込み機能を再現できるんじゃないの?)
ライブラリ使ったら、誰かの言葉じゃないが、言語間の違いなんぞ簡単に埋められるさね
0174デフォルトの名無しさん
2012/03/18(日) 02:25:27.96Rubyの場合「組み込みクラスを使わない」となると配列はおろか数値や真偽値すら存在しないことになっちゃうし
演算子も大半のものがメソッド扱いなんで、言語としてほとんど成り立たなくなる
逆に大量の機能が言語本体に組み込まれてるから
上に書かれたようなのは全くrequireを行なわなくても実行できちゃう
なので「ライブラリ使用禁止」が「組み込みも禁止」だと無茶だし
「組み込みOK、require禁止」だとpermutation一発じゃん、となるワケで線引きが難しいと思う
0175デフォルトの名無しさん
2012/03/18(日) 02:29:04.34ここのpermutationsの使用例で動作確認した
http://rubyist.g.hatena.ne.jp/edvakf/20090416/1239829830
checkPermu xs = and.concat $ check xs
where
check [] = []
check (x:xs) = map (x/=) xs : check xs
permutations 0 _ = [[]]
permutations _ [] = [[]]
permutations n ns = [x:xs | x <- ns, xs <- permutations (n-1) ns, checkPermu (x:xs)]
意図せず、>>161のライブラリVerより自由度が上がった(ruby版の使用例のお陰?)
>>170
ネイティブ関数に関しては、言語によってネイティブ関数を少なめにするポリシーがあったりするからな・・・
(主に言語仕様の軽量化。ライブラリとして追い出して、言語仕様をスリムにするため。Cとrubyはそれぞれ、その極端な例)
たしか、JavaやPythonもどっちかと言うとライブラリに追い出す主義のはず
0176デフォルトの名無しさん
2012/03/18(日) 02:34:52.73それはrubyが異質なだけ
上でも書いたが、rubyは何でもデフォルトに詰め込みすぎなのよ
どっかで読んだが、JavaやPythonは小クラス主義で、rubyは大クラス主義なんだと
小さなクラスの組み合わせでプログラム作るか、大きなクラスに何でもさせるか
この変はパフォーマンスとの兼ね合いや、自由度とかの兼ね合いになるんだろうけど
0177デフォルトの名無しさん
2012/03/18(日) 03:03:46.85開発効率を比べてみないか?
まあ、さすがに非公開ライブラリとかじゃダメだが。
0178デフォルトの名無しさん
2012/03/18(日) 07:28:55.36allPattern 0 _ = [[]]
allPattern _ [] = [[]]
allPattern n ns = [x:xs | x <- ns, xs <- allPattern (n-1) ns]
permutations n xs = filter checkPermu $ allPattern n xs
各要素(リスト)から先頭要素が偶数のもののみ抽出
filter (\x -> (even.head) x) $ allPattern 3 [1..3]
各要素のリストが昇順になっているもののみ抽出
filter (\(x:y:z:[]) -> x <= y && y <= z) $ allPattern 3 [1..3]
0179デフォルトの名無しさん
2012/03/18(日) 10:12:47.30それなりの規模の内容である必要があるな
0180デフォルトの名無しさん
2012/03/18(日) 11:04:54.77あの程度でいいから関数型言語で作ってみてよ。
0181デフォルトの名無しさん
2012/03/18(日) 11:08:23.440182デフォルトの名無しさん
2012/03/18(日) 11:26:23.79Webドカタ思考は非常にRuby信者らしいじゃん
どうしてRubyアンチ厨だと思ったん?
0183デフォルトの名無しさん
2012/03/18(日) 11:45:35.73自分は、Web系全く触ったこと無いんでパスするが、この辺見ながら、RoRと使い比べてみては?
http://yannesposito.com/Scratch/en/blog/Yesod-tutorial-for-newbies/
0184デフォルトの名無しさん
2012/03/18(日) 12:03:18.74本当に実務レベルのもの要求したって
書けないだろw
だから15分程度でできる課題を用意したのに、
それすらできないのか?
0185デフォルトの名無しさん
2012/03/18(日) 12:07:45.51Rails信者はRuby信者だけど
Ruby信者にはRailsアンチもいる事に注意
0186デフォルトの名無しさん
2012/03/18(日) 12:07:56.84あれはRoRがまだマイナーだった頃、IRCのしかるべきチャンネルに入れば
DHHとかが直接指導してくれた、だなんていう時代の話。
0187デフォルトの名無しさん
2012/03/18(日) 12:12:02.90それなりの”関数”でしかない件。
関数型言語だけではアプリは作れない。
それが関数である宿命。
0188デフォルトの名無しさん
2012/03/18(日) 12:49:16.35英語読みながらだと確実に15分以上かかるじゃないか
おまけに私は全くWebに興味が無い
と言うか、>>175,>>178書いててなんだけど、Haskell入門書もまだ読み終わってない入門中の身なんよ
(正直、>>158見るまで、>>161のライブラリ関数の存在自体知らなかったw)
それなのに、Rubyのコードが>>172のみってのは・・・
今回見たかったのは、プログラミングする際の思考の流れが見たかったんだ
自分の場合は、内包表記で1から3までの重複なしの組み合わせを素直に書くと、こうなる
xs = [1..3]
[[x,y,z] | x <- xs, y <- xs, z <- xs, x /= y, x /= z, y /= z]
んで、1から4の場合はこうなる
xs = [1..4]
[[w,x,y,z] | w <- xs, x <- xs, y <- xs, z <- xs, w /= x, w /= y, w /= z, x /= y, x /=z, y /= z]
ここで、w /= ..., x /= ..., y /= ...に注目する
w /= x, w /= y, w /= z
x /= y, x /= z
y /= z
と、x /= ...と、y /=...については、1から3と共通な事が分かる
1から5や、1から2についても、同様な法則性があるだろう
そう言う思考の流れでcheckPermuは組んでみた
なので、出来れば、>>172書いた人はどういう思考の流れで組んだのかお聞きしたい
0189デフォルトの名無しさん
2012/03/18(日) 12:50:53.340190デフォルトの名無しさん
2012/03/18(日) 12:56:25.47一般のプログラミングで1から3までの重複なしの
組み合わせを書くことなんてまずないよ。
そんな考えることが殆ど無いこと、
思考の流れなんて言われても思考しません。
あえて言うのなら、「重複なしの組み合わせ」を返すメソッドを書いて
それを呼び出すだけだな。ぱっとコードを見て説明(名前)が必要なら関数にする。
xs = get重複なしの組み合わせ(1,3);
すごくわかりやすいよね。
あんた、実戦経験ないんじゃない?
プログラミングのための勉強ばっかしてて
動くアプリを作ったことないでしょ。
0191デフォルトの名無しさん
2012/03/18(日) 12:56:53.80お前のレス見たので5秒w
0192デフォルトの名無しさん
2012/03/18(日) 13:02:12.43ライブラリでサポートされるのも、
違いを感じないな。
とある言語なら、こうやって書ける!と言われても、
たしかにこの言語でそれ書くの大変だけど、
とある言語では、そうやって書ける構文を言語開発者が
作ってくれてるだけだよね。
作ってくれてるから楽だ。という話なら
それがライブラリでも、作ってくれてれば楽だよね。
言語仕様も、ライブラリも大差ないんじゃない?
この考え、否定出来ないな。
0193デフォルトの名無しさん
2012/03/18(日) 13:05:19.48日本のIT業界が世界に勝てない理由が分かった気がする・・・
0194デフォルトの名無しさん
2012/03/18(日) 13:07:04.68うん。開発力の差だよ。
やつらは、まずとりあえず動くものを作る。
そしてあとで直す。こういうやり方。
0195デフォルトの名無しさん
2012/03/18(日) 13:09:08.78まず、動くものが出来るスピードが大事。
興味がないと言ってる場合じゃないよ。
0196デフォルトの名無しさん
2012/03/18(日) 13:31:31.34それもあるが、考える力が全般的に負けてるんじゃないか?
(自分も人の事言えないが、壁にぶち当たったときの突破力みたいなのがRubyじゃ身につかなさそうな意見だ)
素人のコードに付き合う余裕も無いとは・・・
実践じゃ、ありもののコード使えばいいけど、頭の体操も実践風にするのはどうなの
0197デフォルトの名無しさん
2012/03/18(日) 13:36:25.08既存ライブラリの成熟、過去との互換性、新技術見極め、開発者集め、
どちらも自分が頑張っただけじゃ解決しない
もっと面倒な問題だ。
0198デフォルトの名無しさん
2012/03/18(日) 13:38:44.540199デフォルトの名無しさん
2012/03/18(日) 13:40:51.49使われてないからか。
0200デフォルトの名無しさん
2012/03/18(日) 13:44:34.99Haskellと同じ長さ/時間でプログラムを書けたとしても
同等じゃないんだよ
全ての変数にkind_of?でチェックを入れても、
所詮は実行時チェックにすぎないから
まだ同等じゃない
0201デフォルトの名無しさん
2012/03/18(日) 13:51:50.56> 同等じゃないんだよ
いや、速く作れる。
0202デフォルトの名無しさん
2012/03/18(日) 13:54:33.14これって、割と有名なサービスだと思うけど・・・
http://tanakh.jp/pub/unisys-tech-2011-11-09.html#7
0203デフォルトの名無しさん
2012/03/18(日) 13:56:42.59daemontoolsの再実装のことですか?
仮想ドライブじゃない方の
daemontoolsですよね?
0204デフォルトの名無しさん
2012/03/18(日) 13:59:43.03それは、(ウェブ)サービスではなく
UNIXのサービス管理ツールだ。マヌケめ。
0205デフォルトの名無しさん
2012/03/18(日) 14:00:39.82data Expr a =
TRUE
| FALSE
| And (Expr a) (Expr a)
| Or (Expr a) (Expr a)
| Not (Expr a)
| Base a
eval :: (t -> Bool) -> Expr t -> Bool
eval evalBase expr =
case expr of
TRUE -> True
FALSE -> False
Base base -> evalBase base
And x y -> eval' x && eval' y
Or x y -> eval' x || eval' y
Not x -> not $ eval' x
where eval' = eval evalBase
0206デフォルトの名無しさん
2012/03/18(日) 14:02:37.01なんでいつも関数レベルの話しかせんのだ?
設計レベルの話しろよ。
デザインパターンを関数型言語で実装するとか
0207デフォルトの名無しさん
2012/03/18(日) 14:11:32.23宣言を明示するパラダイムとは全く逆のことをしている。
0208デフォルトの名無しさん
2012/03/18(日) 14:16:12.84拡張性のある関数。
なぜこの言葉に違和感があるのだろうか?
0209172
2012/03/18(日) 14:24:18.89俺は手続き的に、最初に自分が手でその作業をやる場合の手順を考えた
1〜nのカードを用意して、手から順番に机の左から置いてくイメージ
そのイメージをする中で、1枚置いたら、その残りで同じことを繰り返す…つまり再帰であると気付いたって感じ
0210デフォルトの名無しさん
2012/03/18(日) 14:27:20.702.関数型って言えば再帰だよねwww
3.やってみた。
こんな感じ。
0211デフォルトの名無しさん
2012/03/18(日) 14:52:30.30コンビネータを知らないから
0212デフォルトの名無しさん
2012/03/18(日) 14:56:49.54うん。それで?
0213デフォルトの名無しさん
2012/03/18(日) 15:00:56.350214デフォルトの名無しさん
2012/03/18(日) 21:37:40.20GoFに実装する価値のあるもん在ったっけ?
0215デフォルトの名無しさん
2012/03/18(日) 21:42:49.62デザパタを勘違いしてないか?
最初に何かしたいというお題があって
それをオブジェクト指向で実装したのが
デザインパターンね。
最初の何かしたいというお題は
別にオブジェクト指向に限ったものじゃないよ。
0216デフォルトの名無しさん
2012/03/18(日) 22:21:20.65どうして抽象化して再利用できるようにしないのか?
それはつまりデザパタが行える抽象化は
関数プログラミングでは取るに足らないばかりなので
一瞥の価値もないからだ。
と密かに思ってるんだけどどうだろう
0217デフォルトの名無しさん
2012/03/18(日) 22:29:29.87デザインパターンは抽象化して
再利用できるようにしたものだよ。
だから、あんたの結論は逆
0218デフォルトの名無しさん
2012/03/18(日) 22:57:07.07実装できず、「パターン」とするしかないものもある。Smalltalkでは確か
そういうパターンのいくつかは具体的に実装できるとかいう話があったはず。
0219デフォルトの名無しさん
2012/03/18(日) 23:15:13.21実装が違っても、パターンと呼ばれる概念は存在する。
0220デフォルトの名無しさん
2012/03/18(日) 23:58:41.53コードは何も変わらなくても、概念が有名になれば説明しやすくなって可読性は向上する
0221デフォルトの名無しさん
2012/03/19(月) 00:25:35.48パターンを抽象化したのなら元の記述より短くならないと
書き写すのは抽象化とは言わないでしょ
でも何となくわかったよ
javaでは抽象化はできないんだね
だからパターンってもので凌ぐわけだよ
でやっぱり関数型で行える抽象化からすると
デザパタはおもちゃにしか見えないというか
だからパターンってもので凌ぐわけだよ
でやっぱりデザパタは関数型で行われる抽象化からすると
0222221
2012/03/19(月) 00:29:00.390223デフォルトの名無しさん
2012/03/19(月) 00:33:12.350224デフォルトの名無しさん
2012/03/19(月) 00:56:24.28元々は建築家がいかに住人参加型の街づくりが出来るかを考えたものだからな。
数学的な抽象化とはまるで意味合いが違う。
違うものを同列に語るのは間違っているし、優劣を付けるのも同様。
0225デフォルトの名無しさん
2012/03/19(月) 00:58:15.820226デフォルトの名無しさん
2012/03/19(月) 01:57:44.05オブジェクトは書き写すとは言わないでしょ
書き写すのはstringだが、stringは関係ないな
0227デフォルトの名無しさん
2012/03/19(月) 02:47:22.22class undefinedObject;
全部共通のポインタにいれたいなら、shared_ptr<void>で解決
0228デフォルトの名無しさん
2012/03/19(月) 07:17:56.65Interpreterパターンも使ってる
0229デフォルトの名無しさん
2012/03/19(月) 07:31:17.070230デフォルトの名無しさん
2012/03/19(月) 10:12:40.12書き方が下手だとかそういう瑣末な話ではなく論理的な無駄が多い。
エレガントさに目覚めたHaskell厨には頑張って欲しい。
しかしこういう論理的にガチガチなのは平均的なプログラマーには受け入れられないだろうな。
0231デフォルトの名無しさん
2012/03/19(月) 11:06:48.16参照やポインタありきなデータ構造をピュアにすんのが辛い。
何かこの構造はこう書けるとか、代わりにこれ使えとかいう指針はないの
0232デフォルトの名無しさん
2012/03/19(月) 11:51:36.72何も勉強しなくても自然にエレガントな構造になってたって話だろ
0233デフォルトの名無しさん
2012/03/19(月) 13:25:25.680234デフォルトの名無しさん
2012/03/19(月) 13:28:55.61再帰とか高階関数とか、dataで独自データ型作るとかで大体対応出来る
0235デフォルトの名無しさん
2012/03/19(月) 14:13:18.29プロの棋士じゃないんだから
「たった一手悪手を指しただけで敗北」
みたいなのはいらない
0236デフォルトの名無しさん
2012/03/19(月) 14:59:32.850237デフォルトの名無しさん
2012/03/19(月) 18:53:35.57博士論文版(PDF)の方はSMLコードしか載っていませんが、
本の方はHaskellコードが巻末に載っているそうです。
英語が苦手でもHaskellが得意なら活用できるかもしれません。
PFDS読書会が進行中なので議事録が参考になると思います。
Purely Functional Data Structures
http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf
Purely Functional Data Structures
http://www.amazon.co.jp/dp/0521663504
Purely Functional Data Structures読書会議事録
http://wiki.haskell.jp/Workshop/ReadPFDS/
20分でわかる Purely Functional Data Structures
http://www.kmonos.net/pub/Presen/PFDS.pdf
0238デフォルトの名無しさん
2012/03/19(月) 21:18:01.23mallocに関して他の板でも同じ事をいってたヤツがいたな。
どっから出たガセねたなんだろ。
glib使ってるgccは、mallocつかうと毎回mmap呼ぶし、
Windows上のgccとcl.exeは、Platform SDKにある同じ
malloc関数を使う。そのmalloc関数のコールスタックを追うと
毎回HeapAllocを内部で呼んでる。
なんでそういう仕組みになってるか多少考えればすぐ解るはずなんだけどな。
OSのメモリ関数は、呼ばれても実際にはメモリーを割り当てない。
仮に複数のアプリが同時に2GBの領域を要求しても実際にメモリーを
割り当てないことでスライシングに陥るという最悪の事態を緩和してる。
個々のソフトでメモリー管理なんかしてたらシステム全体として遅くなんだよね。
0239デフォルトの名無しさん
2012/03/19(月) 21:20:41.77メモリアロケータとか
newの実装を勉強してから
またおいで。
0240デフォルトの名無しさん
2012/03/19(月) 21:23:34.66newも毎回呼び出してる。
アロケーターとはそもそも書いてなかったろ。
余談がアロケーターはちっさいオブジェクト作るときやたらと重いし
学が無いなら黙っとけよ
0241デフォルトの名無しさん
2012/03/19(月) 21:24:13.71呼び出してませんよ。
0242デフォルトの名無しさん
2012/03/19(月) 21:25:17.66ソース。
0243デフォルトの名無しさん
2012/03/19(月) 21:37:59.73いずれかに定義しているoperator new呼んでて、そんなかで毎回
HeapAlloc呼んでたわ
0244デフォルトの名無しさん
2012/03/19(月) 21:50:53.53こういうのがあって、結局newしてるだけ。
例えばgccはnew_allocator.hってのに定義してある。
pointer
allocate(size_type __n, const void* = 0)
{
if (__builtin_expect(__n > this->max_size(), false))
std::__throw_bad_alloc();
return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
}
0245デフォルトの名無しさん
2012/03/19(月) 21:52:12.74>おまえらpermutationはsortの逆関数だと気付くまでに何分かかった?
30分たったがまだ分からん。
0246デフォルトの名無しさん
2012/03/19(月) 21:54:08.38>>241
さー苦しくなって参りました
そーすっ! そーすぅ! 早よ出せ そーす!
0247デフォルトの名無しさん
2012/03/19(月) 21:57:08.54実装の一つでも挙げてみろよw
0248デフォルトの名無しさん
2012/03/19(月) 21:57:35.05デザパタは抽象化なんかじゃない。
しかし(だから)取るに足らないものであるのはその通りだ。
まだ分からん奴が多いらしい。
0249デフォルトの名無しさん
2012/03/19(月) 21:59:06.59glibcじゃなくてglib?
0250デフォルトの名無しさん
2012/03/19(月) 22:01:41.48cがあろうが無かろうがそんな揚げ足どうでもいいだろ
mingw-w64-crtとソレが呼び出してるライブラリだ
0251デフォルトの名無しさん
2012/03/19(月) 22:06:17.98なんだWindowsべったりの話か。どうでもいいや
0252デフォルトの名無しさん
2012/03/19(月) 22:07:58.36だからWindows以外でいいから実装一つでも出してみろよ
linuxだと毎回確実にmmap呼び出してるぞ
俺のPC Linuxだし
■ このスレッドは過去ログ倉庫に格納されています