1read 100read
2012年3月プログラム131: 【激突】関数型言語 VS オブジェクト指向言語 (407) TOP カテ一覧 スレ一覧 2ch元 削除依頼
【node.js】サーバサイドjavascript【Rhino】 (678)
"Code of the Nerds" Digital Mars C/C++ (344)
J言語 (194)
プログラマー的"女の口説き方" (709)
monazilla Part 6 (368)
"Code of the Nerds" Digital Mars C/C++ (344)

【激突】関数型言語 VS オブジェクト指向言語


1 :12/03/10
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう

2 :12/03/10
このスレッドは天才pンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
                  京都大学霊長類研究所

3 :12/03/10
皆さん、試しに首を90度傾けてみて下さい。
今まであったはずの上と下
なんと!
右と左になってしまったではありませんか
これが、21世紀最大の偉大なる発見です。
上へ上へと鎬を削る時代は終わりました。
これからは、自由自在に方向を変えてみようじゃありませんか。

4 :12/03/10
オブジェクト指向型言語の圧勝だろ
関数型とか誰が使ってるんだよ

5 :12/03/10
鎬(しのぎ)

6 :12/03/10
OCaml使え、で終了

7 :12/03/10
いずれにしろ関数型言語とオブジェクト指向言語の特徴を併せ持つC#が最強って事。

8 :12/03/10
じゃあC#とC#戦わせたらどっちが勝つん?

9 :12/03/10
F#とC#

10 :12/03/10
ちゃんと将来のコンピューターでも対応してくれるほうが勝つわ!!

11 :12/03/10
オブジェクト指向言語 ・・・ 実用言語
関数型言語 ・・・ 学習用言語

12 :12/03/10
オブジェクト指向言語・・・ドカタ用
関数型言語・・・馬鹿には無理

13 :12/03/10
あちゃw
またドカタってうるさいやつが
来たかw

14 :12/03/10
実際関数型のほうが適している場面ってどんなときなの?

15 :12/03/10
>>1
不毛。削除依頼出しとけよ

16 :12/03/10
>>15
ボロ負け確実の関数型言語厨必死だなwww

17 :12/03/10
>14
入社試験でバカをふり落とすとき。たとえ入ってから使うのがオブジェクト指向のみであっても。

18 :12/03/10
>>16
はい?オブジェクト指向言語しか使わないけど

19 :12/03/10
>>1
目クソ鼻クソを嗤うの類だな

20 :12/03/10
>>14
一度組んだらその後変更が無いシステムで
絶対にバグを出したくないとき
じゃないかな

21 :12/03/10
>>20
それ、仕様言語とかの方じゃないか?

22 :12/03/10
どっちか選べるなら優劣を比較する意味もあるけどさ
ドカタはOOPしか使えないだろ?関数型言語でまともにコード書けないだろ?
だったら悩む必要ないじゃん

23 :12/03/10
関数型言語信者って、差別主義者が多いようだね
根拠もなく優越感だけ持ってる

24 :12/03/10
Common Lispなら手続き型も関数型も出来るから最強じゃん
CLOSでオブジェクト指向もサポートしてるから最強じゃん
そもそも、CLOS無しでもオブジェクト指向っぽく書けるから最強じゃん

25 :12/03/10
staticおじさんと似たような発想だよなぁ

26 :12/03/10
関数型で人のコード読ませられるのはたまらんな。

27 :12/03/10
それは、バッカスの言うところの「一時に1語」のスタイルに頭が慣れてるから。
関数型に慣れたら副作用を考えなくていいのですごく楽なのに。

28 :12/03/10
物覚えの悪いCPUと、思考力の無いメモリとが一言ずつ喋りあいながらやってる、ってやつだっけ?
メモリスタとかで状況が変わるかもな。

29 :12/03/10
本当にオブジェクト指向言語と言い切れるのはどんな言語?

30 :12/03/10
なんて不毛なんだろう。。

31 :12/03/10
すまないがハゲ以外は帰ってくれないか?

32 :12/03/10
>>27
> 関数型に慣れたら副作用を考えなくていいのですごく楽なのに。
副作用のないアプリはないんだよ。

33 :12/03/11
これを思い出した
http://news.mynavi.jp/news/2012/03/06/060/

34 :12/03/11
ビタミンEの限度を超えた摂取は骨粗鬆症を招く可能性あり -慶応大らが解明

35 :12/03/11
関数型言語とオブジェクト指向言語があわさって最強になってる言語ってないの?

36 :12/03/11
F#とか?

37 :12/03/11
Scalaだろうな。
関数型言語 + オブジェクト指向言語 + コンパイラ言語
これでネイティブコードはいて
どのマシンでも動けば完璧なんだが。

38 :12/03/11
D

39 :12/03/11
foldl _ v [] = v
foldl f v (x:xs) = foldl f (f v x) xs
sum = foldl (+) 0
product = foldl (*) 1
reverse = foldl (\ys x -> x:ys) []
length = foldl (\n _ -> n + 1) 0
再利用出来すぎ
LLだって、オブジェクト指向の機能のみではここまで再利用は出来まい

40 :12/03/11
>>35
プログラム意味論あたりの研究で
関数型とオブジェクト指向は完璧には組み合わせられないって
いう結論が出ているらしい

41 :12/03/11
>>32 「考えなくていい」というレトリックがわかってないね。
参照透明性を壊すような副作用がないから、「考えなくていい」ということ。

42 :12/03/11
>>39
Rubyなら再利用できますけど、何か?
def fold(init, xs, &fn)
  case xs.length
  when 0
    init
  when 1
    fn.call(init, xs[0], &fn)
  else
    result = fn.call(init, xs[0])
    for x in xs[1..(xs.length - 1)]
      result = fn.call(result, x, &fn)
    end
    result
  end
end
def sum(ary); fold(0, ary) { |s, x| s + x }; end
def product(ary); fold(1, ary) { |p, x| p * x }; end
def reverse(ary); fold([], ary) { |xs, x| xs.unshift(x) }; end
def length(ary); fold(0, ary) { |n, _| n + 1 }; end

43 :12/03/11
>>42
なるほど。Rubyで書き直すとクソコードになるって事ですね。

44 :12/03/11
メソッドfoldの定義が冗長だったので、>>42を訂正する
def fold(init, xs, &fn)
  if xs.empty?
    init
  else
    result = fn.call(init, xs[0])
    for x in xs[1..(xs.length - 1)]
      result = fn.call(result, x, &fn)
    end
    result
  end
end
def sum(ary); fold(0, ary) { |s, x| s + x }; end
def product(ary); fold(1, ary) { |p, x| p * x }; end
def reverse(ary); fold([], ary) { |xs, x| xs.unshift(x) }; end
def length(ary); fold(0, ary) { |n, _| n + 1 }; end

45 :12/03/11
>>44のメソッドfoldの定義を更に簡潔にしてみた
def fold(init, xs, &fn); xs.inject(init, &fn); end
def sum(ary); fold(0, ary) { |xs, x| xs + x }; end
def product(ary); fold(1, ary) { |xs, x| xs * x }; end
def reverse(ary); fold([], ary) { |xs, x| xs.unshift(x) }; end
def length(ary); fold(0, ary) { |xs, _| xs + 1 }; end

46 :12/03/11
>>45
簡潔というか、foldの実装をinjectに押し込めただけだよね
foldとinjectは機能的に殆ど同じだから

47 :12/03/11
>>46
そのとおりだね
ただし、>>44,45のコードは、>>39
>LLだって、オブジェクト指向の機能のみではここまで再利用は出来まい
という「関数(メソッド)の再利用性」に対する具体的な反論になっているんじゃないかな?

48 :12/03/11
引数2個程度のメソッドの再利用で再利用性が高いとか言っちゃうのもどうかね。
オブジェクト指向の再利用で典型的なのはGUIコンポーネントなどで、
複数の入力に対して複雑な出力があるものだから比較になってない。

49 :12/03/11
上位クラスに小さなバグがあっても
継承したクラスで関連するメソッドをオーバーライドして修正できるのも再利用性なんだよな。
バグがあるのが悪いというのは論外で、他人が作った資産だったり、すでにオブジェクトファイルに固めてあったり色々な事情がある。

50 :12/03/11
あとね、いくら簡潔に書けてもドカタに理解できないコードは再利用性が低いと言えるんだ。

51 :12/03/11
ドカタ、ドカタと言っている人何者なの?
建設的な議論を妨げてるような気がするんだけど

52 :12/03/11
ドカタが気に障ったのかな?
じゃあ言い方を変えて猿でもわかるコードならば再利用性があると言える。

53 :12/03/11
ほとんどのオブジェクト指向言語のカプセル化は、猿でも簡単に壊せるよね。
たとえばHaskellのIOモナドみたいな堅牢性はどこにもない。

54 :12/03/11
ああ、単なる馬鹿か

55 :12/03/11
どんな堅牢でも外部プロセスからメモリ書き換えればなんでも壊せる

56 :12/03/11
IOモナドがどう堅牢なのかご高説を賜りたいものです。

57 :12/03/11
関数型言語を全く知らずにスレを立てる程のバカであることが判明しましたw

58 :12/03/11
たとえば Int -> Int 型の関数の中から unsafePerformIO を使わずに、
"Hello World" って出力しようとしてみればわかるけど、
それすら知らない程の超弩級のバカですねw

59 :12/03/11
なんか誰に対して何を言っているのか良くわかんないけど、
Haskell信者が傲慢で独り善がりな事だけはわかった。

60 :12/03/11
> どんな堅牢でも外部プロセスからメモリ書き換えればなんでも壊せる
傲慢で独り善がりってこういう主張のことを言うんですよw

61 :12/03/11
Haskellは神
Haskellerは神の使徒
ML厨やLisp厨は異端
煉獄の火の中に投げ入れられるべき
命令形言語厨は異教徒
豚畜生と変わらない

62 :12/03/11
で、具体的な反論は?

63 :12/03/11
>>47
ブロックは確かにSmalltalkでもオブジェクトとして有るんだけど、一般的なオブジェクト指向言語には無いのがなぁ・・・
結局、再利用性を高めるためには継承・隠蔽・多態性よりも、関数を値として渡すという関数型言語的な処理の方が有用なんじゃなかろうか
実際、C++やJavaで再利用性に欠かせないテンプレート(ジェネリック)は、オブジェクト指向とは無関係で、どちらかと言うと関数型言語の型推論に近い(これも関数型言語とは無関係と言われればそれまでだが)
そう考えると、型推論的なものと、関数を値として扱える機能が、再利用性向上に寄与してるとも言える
オブジェクト指向の多態性に当たるオーバーライド、オーバーロードはテンプレート(ジェネリック)を使ってなるべく利用しない方向に向かってるのが何よりの証拠とは言えないだろうか
そう考えると、型を意識するオブジェクト指向と関数型のそれぞれの言語を持ち出した方が、より生産性に有用な機能がどれかを浮き彫りにしてくれそうな気がする

64 :12/03/11
>オブジェクト指向の多態性に当たるオーバーライド、オーバーロードはテンプレート(ジェネリック)を使ってなるべく利用しない方向に向かってるのが何よりの証拠とは言えないだろうか
全く意味がわからない。
(バカだからわかんねーんだよwwっていうのはHaskell信者だけにしてほしい)

65 :12/03/11
いや、ブロックというかクロージャでいいだろうし、メソッドを呼び出せるオブジェクトはクロージャとして
使えるから、そのありなしはほとんどどうでもいいと思う。

66 :12/03/11
>>64 おまえが無知なだけ。

67 :12/03/11
>>66
なんだよ。俺が無知だったらお前は無知以下じゃないか。

68 :12/03/11
>>64
嫌マジ
Haskell信者じゃなくても、馬鹿だから分からねーんだよって言われて良いレベル
Javaに最初ジェネリックが無かったのに、何で入ったか考えてみ?
継承はともかく、今や、多態性はオブジェクト指向の機能は補助的なものに過ぎない
多態性指向と言うか、テンプレートやジェネリックは別のプラットフォームのものと考えるべきものだろう
関数型とも違うプラットフォームとも言える。と言うか、オブジェクト指向も、関数型も、元は型が無い前提だったんじゃないかと思える
実行速度、安全性などの理由で型も意識した結果がテンプレート(ジェネリック)や型推論に落ち着いたと想像してる

69 :12/03/11
型でガチガチにすれば安全になるのはわかっている。これはなんでもそう。
(型なしラムダ計算があったりするように、どちらにも型なしの世界はある)
安全になることはわかってるけど、
・いちいち型を書くと、無駄に冗長
・配列とかリストとかのコレクションとか、ガチガチをあえて緩めるか
 組み合わせの数だけ(整数の配列、浮動小数点のリスト、…)型が必要
という問題があるから、それをエレガントに解決するために使われるのが、
型推論やジェネリック型(や型クラス)。

70 :12/03/11
>オブジェクト指向の多態性に当たるオーバーライド、オーバーロードはテンプレート(ジェネリック)を使ってなるべく利用しない方向に向かってるのが何よりの証拠とは言えないだろうか
相変わらずこれの意味がわからない。
オーバーロードを多態性だってのはわかるけどオーバーライドが多態性かっていうと?だし
テンプレートやジェネリクスでオーバーライド、オーバーロードが制限されることもないし
利用しないようになっているというのもわからないし。
それが何よりの証拠になる理屈もわからない。

71 :12/03/11
型による安全性という概念を知らない、ないしわからない、ということはわかった。

72 :12/03/11
>>71
なんだよ〜C++がテンプレートを取り入れた当初から
バリバリつかってた俺は経験的によーく知っているつもりだけどな。
なんか見下す事しか出来ない奴らだなおまえらって。

73 :12/03/11
>>69
そうそう!
それが俺の言いたかった事!

74 :12/03/11
>>63
>オブジェクト指向の多態性に当たるオーバーライド、
>オーバーロードはテンプレート(ジェネリック)を使ってなるべく利用しない方向に
>向かってるのが何よりの証拠とは言えないだろうか
>>64,70ではないがw、自分も何を言いたいのか分からない
動的型付けなオブジェクト指向言語であるSmalltalk/Rubyでは「(>>63の)都合が悪い」から
話を静的型付けな言語(C++/Java)へ持って行きたい、というのなら分かるのだけれど.....
Lisp/Scheme/Logoのように動的型付けな関数型言語も存在しているわけで、
型付け(動的と静的)と計算モデル(命令型と適用型)をゴッチャにして
理解したつもりになっていまいか?

75 :12/03/11
>>69
>それをエレガントに解決するために使われるのが、
>型推論やジェネリック型(や型クラス)。
C++やJavaのジェネリック型が、エレガントにはとうてい見えない件について.....

76 :12/03/11
すまん俺も少しおかしな事を言っていた、
オブジェクト指向においてオーバーライドは多態性そのものだな。
あの一行を除けば>>63の言いいたい事は解るよ。

77 :12/03/11
>>74
> Lisp/Scheme/Logoのように動的型付けな関数型言語も存在しているわけで、
> 型付け(動的と静的)と計算モデル(命令型と適用型)をゴッチャにして
> 理解したつもりになっていまいか?
計算モデルで分類するならLisp/Scheme/Logoは命令型ですよ

78 :12/03/11
関数型言語の一般的な定義からすればLisp/Scheme/Logoも関数型言語だろ
一般的な定義は「関数がファーストオブジェクトである」

79 :12/03/11
さいしょのオブジェクト?

80 :12/03/11
> 一般的な定義は「関数がファーストオブジェクトである」
ファーストオブジェクトって何?
ファーストクラスオブジェクト、ってことなら、PythonとかJavaScriptとか、
最近の言語がみんな関数型言語になっちゃいますけど。
C言語は関数型言語、に類似のデマに惑わされてる人でしょあなたも。
>>75
C++はジェネリックというよりテンプレだから。Javaと一緒にすんな。

81 :12/03/11
よしこれからは依存型のある言語だけを関数型言語と呼ぼう

82 :12/03/11
LLバトスレからコピペ
 82 名前: デフォルトの名無しさん Mail: sage 投稿日: 2012/03/09(金) 12:07:14.32
 実用期を迎えた関数プログラミング 参加レポート
 ttp://sea.jp/?p=937
 > つまり、関数プログラミングを快適に実践するには、関数を変数に格納できるという程度では不十分だということです。
 > 関数プログラミングを支援する言語機能として、以下のようなものが紹介されました。
 >
 > ・関数を変数に格納でき、さらに無名でも定義できること
 > ・関数内部が静的なスコープを持つこと
 > ・関数の引数の一部だけを変数にバインドした別関数を返す部分適用を簡単に利n用できること
 > ・変数は上書きしない。配列、リストの中身も書き換えない
 >
 > これらの機能は、関数を頻繁に定義し、それをいろいろな場所に渡して使用する以上ないと困るし、
 > 変数が上書きされたり副作用があると関数を組み合わせて使用することが難しくなるのだろう、と私は理解しました。
 >
 > 個々の要素、例えば高階関数や部分適用などのみに注目して他言語、JavaScriptやRubyなどを見ていけば、
 > これらの機能を備えた命令型言語はたくさんあると思います。
 >
 > 実際、関数を使ったプログラミングもできると思うのですが、やはり型や変数の取り扱い、
 > 副作用をどのように扱うか、スコープや値の評価方法など、関数型言語としてデザインされた言語でなければ、
 > 関数プログラマーの方々がおっしゃるレベルの関数プログラミングは実現できないのだろうと感じました。

83 :12/03/11
>>82
高階関数、モジュール指向、ラムダ関数、論理型ってこと?
モジュール指向は当たり前だし論理型は余計な感じもする。

84 :12/03/11
手段と目的が逆になってる。
関数型言語を使うことが目的になってる。

85 :12/03/11
関数型言語の本質 = オブジェクト指向と混ぜた時に
絶対実現不可能なこと。

86 :12/03/11
>>85
絶対って言葉をあんま使わん方がいいぞ。
関数型の典型であるLispのオブジェクト指向
http://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/objectOrientedLisp.html

87 :12/03/11
>>86
プログラム意味論あたりの研究で
関数型とオブジェクト指向は完璧には組み合わせられないって
いう結論が出ている

88 :12/03/11
>>87
証明は?で君はそれを理解しているの?受け売りはいかんよ。

89 :12/03/11
>>86
最近の関数型言語信者はLispは関数型言語じゃないとか言ってるよ
WEB+DBマガジンに関数型言語についての記事があるけど
Lispを関数型言語から排除していた

90 :12/03/11
関数型言語は処理のリストを簡単に作る事ができる。
[処理,処理,処理,処理]
オブジェクト指向言語はこれを実現できないわけじゃない
Operationクラスを作ってoperationメソッドを作って
Operationを継承するクラスを各処理ごとに作ってoperationメソッドをオーバーライドして
それらをOperationリストに突っ込めばいい。
高階関数もFactoryやリフレクションを駆使してムリクリ作る事はできる。
でも高階関数モドキやラムダ式モドキをわざわざ作らない。あまり必要ないから。

91 :12/03/11
ああ確かに不毛だなこのスレ

92 :12/03/11
関数型っていうのは副作用を許さないから、
どうしても関数型の理論だけで完結することはできない。
だからどの関数型言語も、関数型理論とは外れる機能を搭載している。
世の中に必要とされているシステムってのは絶対に副作用が必要だから、
関数型とそれ以外(たいていはオブジェクト指向)を混ぜた言語が使われる。
昔は、関数型にそれ以外を追加した、関数型ベースの言語が使われていたが
最近はオブジェクト指向に、関数型の機能を追加した、
オブジェクト指向ベースの言語が使われてきている。
また旧来の言語も、関数型の理論を取り入れてきている。
もう、それでいいんじゃね? 関数型ベースなんてもう流行らないよ。

93 :12/03/11
昔:馬鹿はプログラミングしなかった(だから関数型ベースで問題なかった)
今;馬鹿もプログラミングするようになった

94 :12/03/11
オブジェクト指向は流行らないよ、と必死にわめいていたバカにそっくりだーw

95 :12/03/11
>>89
添削
 X: 最近の関数型言語信者はLispは関数型言語じゃないとか言ってるよ
 O: Haskell信者はLispは関数型言語じゃないとか言ってるよ
>WEB+DBマガジンに関数型言語についての記事があるけどLispを関数型言語から排除していた
それは静的型付けな関数型言語に関する記事だからという理由じゃないのかな
その記事で「Lispは関数型言語じゃない」と書いてあるの?
参考として「やっぱり動的型付け言語は大規模開発で効率が悪い 2」スレ(dat落ち)からコピペ
 366 名前: デフォルトの名無しさん Mail: sage 投稿日: 2011/10/26(水) 12:25:43.06
 >>365
 それはハスケラ特有の症例で、心の病の一つ
 ハスケルという言語を使っていると、世の中のあらゆる事柄すべてが
 ハスケルを中心に廻っているように見えるらしい
 従って、あらゆる関数型言語は静的実行かつ静的型付けでなければならないし、
 遅延評価が常識であり、一切の副作用は認めようとしない
 ハスケラにとって関数型言語とはハスケルのことであり、
 その窓から見える世界が彼らのすべて

96 :12/03/11
こういうスレタイにすべきだったな
Haskell VS その他の関数型言語 VS オブジェクト指向言語
Haskeller VS その他の言語使用者

97 :12/03/11
>>1 がそもそも関数型言語について全くわかってなかったんだからしょうがない

98 :12/03/11
実際HaskellとLispは
SmalltalkとJavaくらい違う

99 :12/03/11
Haskellってなんていうか、
人を誑かすのは上手いよね。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
C言語は関数ができなくても、理解可能か? (166)
【License】ライセンス総合【利用許諾】 (377)
「Cでプログラミングするには人生は短すぎる」か? (310)
Visual Studio 2008 Part 21 (537)
リファクタリングをただのコード修正と思ってる人へ (267)
【Delphi互換!?】FreePascal/Lazarus その2【GPL】 (257)
--log9.info------------------
後藤羽矢子総合スレ4@4コマ板 (789)
【目障りだ】嫌いな4コマ漫画【消えろ】 (293)
【放課後せんせーしょん!】庄名泉石スレ (102)
水谷フーカ (190)
【ご注文はうさぎですか?】Koi その1【2月27日発売】 (233)
宮原るり22 (419)
まんがタイムきららミラク(Miracle!) vol.4 (547)
ひらのあゆ 5 (895)
【毎月19日発売】まんがタイムきららMAX(マックス)17【芳文社】 (894)
【ひとみとコットン】ワカマツアツト【おおつぶこつぶ】 (833)
名無し決めスレ その2 (788)
【臭い】テンヤはラブリーから消えろ【キモイ】 (788)
【井上純一】中国嫁日記3【井上純弌/希有馬】 (800)
【満開すいーと】 東屋めめ7 【偽装リコーダー部】 (266)
岬下部せすな様様3 (252)
【平成生まれ】ハトポポコ 3チュンチュン♪ (255)
--log55.com------------------
【元乃木坂46】斉藤優里応援スレ★53【ゆったん】
久保史緒里「シンクロニシティとSingOutのMVに全然映ってない」
【乃木坂運輸区】乃木ヲタ鉄道研究部 9両目【乃木坂車両センター】
【乃木坂46】松村沙友理応援スレ 254【さゆりんご】
ブスだと思うメンバー
【元乃木坂46】西野七瀬応援スレ★236【ななせまる】
【悲報】今夜のナニコレ珍百景で賀喜の印象が悪すぎるwwwwwwwwww
【マターリ】NHKスペシャル「戦争と“幻のオリンピック”アスリート 知られざる闘い」