トップページ⇒tech
1001コメント388KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:26:47.61
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

どちらが上なのか、この際はっきりさせましょう

前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0921デフォルトの名無しさん2012/05/25(金) 10:50:55.89
>>918
カプセル化っていうのは有り体に言えば抽象データ型、簡単にはユーザー定義型のこと。
あるいはその作業・手法のこと。OOPでは抽象データ型にクラスを使うから副作用の封じ込め的な
イメージがあるけれど、広い意味での抽象データ型においてはそれだけを意図したものではないよ。
0922デフォルトの名無しさん2012/05/25(金) 10:55:47.86
カプセル化というのはアクセス制御をちゃんとやることです
もっといえば必要なもの以外はpublicにすんな、ということです
0923デフォルトの名無しさん2012/05/25(金) 10:57:00.98
>>920
切り分ければそうだというだけで、別にクラスを使った関数(メソッド)を
内包させるタイプの抽象データ型と、内包しない狭義の抽象データ型の共存が
できないということを意味するものではないよ。
PythonとかScalaとかC#とか普通に(後者は特に巧妙に)やっているでしょう。
0924デフォルトの名無しさん2012/05/25(金) 11:04:29.57
>>922
坊や。危ないからこんなところに来ちゃだめだよ。ほらほらOOP村にお戻りなさい。
0925デフォルトの名無しさん2012/05/25(金) 11:09:01.64
>>921
だとしても「継承、多態、カプセル化」と並べられた場合
カプセル化が意味するところは封じ込めのほうで良いのでは?
0926デフォルトの名無しさん2012/05/25(金) 11:28:10.90
>>921
haskellでのカプセル化はモジュール化して公開するシンボルを制限することだと思うが

>簡単にはユーザー定義型
カプセル化とオブジェクト化を混同してないか
0927デフォルトの名無しさん2012/05/25(金) 11:38:11.45
>>925
必ずしも副作用の「封じ込め」に特化した作業や仕組み、を意図しないのであればはなから異論は無いよ。
それとも、この文脈における「カプセル化」を抽象データ型やユーザー定義型と
言い換えることがダメってこと? それなら君はエセ識者に間違った知識を植え付けられている。
http://www.cs.swan.ac.uk/~csulrich/ftp/adt/adt.pdf
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.55.8524&rep=rep1&type=pdf
0928デフォルトの名無しさん2012/05/25(金) 11:49:49.56
ADTは、カプセル化の型システムからの射影。
0929デフォルトの名無しさん2012/05/25(金) 12:01:22.74
OOPの文脈で
データの抽象化:データと振る舞いを一つにまとめること(クラスベースやプロトタイプベースで実現)
カプセル化:整合性を保つため内部への直接の操作を制限すること(アクセス指定子やクロージャで実現)
0930デフォルトの名無しさん2012/05/25(金) 12:32:36.76
抽象化:派生クラスが何個あるのか気にしない
カプセル化:メンバ変数が何個あるのか気にしない

「obj.fooとobj.barは絶対にアクセスするなよ」と言われると逆に気になってしまう
0931デフォルトの名無しさん2012/05/25(金) 14:12:53.84
OOPのカプセル化も公開するシンボルの制限にすぎんだろ

副作用を制限するって言ってるけど、OOPでカプセル化すれば
同じメソッド呼び出しが常に同じ結果を返すようになるんか?
ならないなら副作用の何を制限してるんだ?
0932デフォルトの名無しさん2012/05/25(金) 15:16:47.49
>>901をSmalltalkに逆翻訳してみた。もちろん厳密にはいろいろと違うけどまあ勘弁して。
>>782や>>799と見比べて、関数型でMultiSet(Bag)が使えてもぜんぜん嬉しくないのはよく分かった。

| M N cards bag replicate randoms |
M := 1000.
N := 10.
cards := 1 to: N.
replicate := [:n :x | Array new: n withAll: x].
randoms := [:g | (g next: N*10) * 2147483647 truncated].
bag := (replicate value: M value: Random new) inject: Bag new into: [:b :g |
   b add: (((randoms value: g) inject: {Bag new} into: [:xs :n |
         xs, {xs last copy add: n \\ N + 1; yourself}])
      detect: [:xs | xs includesAllOf: cards]) size; yourself].
^{bag min. bag max. bag sortedCounts first} "=> {12 . 85 . 56->23} "
0933デフォルトの名無しさん2012/05/25(金) 21:14:49.94
>>932
HaskellのMultiSetはimmutableだから、SmalltalkのBagとはその点で違うよ

immutableなコレクションに値を次々突っ込んでいく場合、
foldl等使って次々に新しいコレクションを生成する必要があるけど、
mutableなデータ構造で同じことやっても無意味に遅いだけだし

だからSmalltalkで真似したときに意味を見出せないのは当然だと思う
0934デフォルトの名無しさん2012/05/25(金) 21:22:35.75
immutableなデータ構造や副作用の隔離による
ミス防止の恩恵は、うっかりなプログラマには嬉しいものだが
全く必要としないプログラマも居るんだよな

SmalltalkerにはHaskellのメリットなんて拘束具にしか見えんのかもしれんね
0935デフォルトの名無しさん2012/05/25(金) 22:02:29.67
>>931
副作用をもたらす経路を制限出来る、というのは副作用を許す言語にとってかなり大きいことだよ
0936デフォルトの名無しさん2012/05/26(土) 00:09:31.75
>>934
つまり、マルチセットをイミュータブルにして、その状態は
リストや再帰コンテキストに封じ込めて破壊的操作の代替にするのは
ミス防止のためっていう理解であってます?
具体的にはどんなミスが想定されて、イミュータブルにすることで
どうしてそれが防げるのか教えてもらえますか?
0937デフォルトの名無しさん2012/05/26(土) 00:41:19.76
>>936
同じ値が複数箇所から参照されてるケースを考えれば分かるよ。
0938デフォルトの名無しさん2012/05/26(土) 01:14:49.41
そういや>>932ってどのくらいの実行速度だったの?
次世代高速CogVM(笑)だから速いんだよね?
0939デフォルトの名無しさん2012/05/26(土) 09:47:01.25
暫定ダイナブック環境ww
老害しか使わないOSもどきの玩具www
0940デフォルトの名無しさん2012/05/26(土) 10:21:30.92
レッテル貼りしかできない馬鹿wwwwwwww
0941デフォルトの名無しさん2012/05/26(土) 16:49:39.04
オブジェクト指向言語って今でもあるのか。
0942デフォルトの名無しさん2012/05/26(土) 18:02:27.90
>>941
お前が何の言語を知っているのか
すごく不安になるwwww
0943デフォルトの名無しさん2012/05/27(日) 17:36:36.53
自分で作った訳でもない言語をドネーションも無しで手に入れて、他の言語ファンを叩くのに使うのが楽しい人って何時の世でも居るんだな。

訂正:本当に使ってるかは判らんか。
0944デフォルトの名無しさん2012/05/27(日) 17:56:22.96
ドネーションの意味がわからない。
どないしよん。

>>943
笑うところだよ。
0945デフォルトの名無しさん2012/05/27(日) 17:59:29.34
HaskellやSmalltalk使ってる人達は
JavaやC#使ってる人達をドカタ呼ばわりして
見下してるから好感が持てる
0946デフォルトの名無しさん2012/05/27(日) 18:06:23.19
>>945
最後の行で不覚にも
09479442012/05/27(日) 18:26:08.71
・・・
09489412012/05/27(日) 19:55:08.90
>>942
Smalltalkっていう言語があったのは知ってるけど。あの言語の
ような徹してオブジェクト指向という言語はあるのかい?
0949デフォルトの名無しさん2012/05/27(日) 20:01:34.46
値打ちのわからない者には何の役にもたたないということ。
0950デフォルトの名無しさん2012/05/27(日) 20:24:44.13
>>948
> ような徹してオブジェクト指向という言語はあるのかい?

中置演算子っぽく見せかけて実は他のメッセージと同じ扱いなので
2 + 3 * 4 => 20 になるような言語ってこと?
0951デフォルトの名無しさん2012/05/28(月) 08:52:12.04
Rubyをdisろうとして失敗してる?
0952デフォルトの名無しさん2012/05/28(月) 19:40:32.58
お題:
整数型を引数に取る、次の性質を満たす関数fを定義せよ。

f(f(x)) = -x

OOPLで解く場合は x.f.f = -x でも良い。
0953デフォルトの名無しさん2012/05/28(月) 20:02:24.48
def f(x):
 return complex(0, x)
0954デフォルトの名無しさん2012/05/28(月) 20:31:07.66
>>953
二回目の関数適用でfの引数が複素数になるぞ。
0955 ◆QZaw55cn4c 2012/05/28(月) 20:43:18.80
場合わけはOK?
f(x) = -x (x >= 0)
f(x) = +x (x <= 0)
0956デフォルトの名無しさん2012/05/28(月) 20:46:51.86
operator=だかoperator==だかを置き換えればいいのだな!
0957 ◆QZaw55cn4c 2012/05/28(月) 20:50:52.15
>>955
ごめん。これ x < 0 のときf(f(x)) = x だった。
降参だ。
0958デフォルトの名無しさん2012/05/28(月) 20:58:11.75
>>957
何か問題でも?
0959デフォルトの名無しさん2012/05/28(月) 21:38:52.33
>>958
御題の条件が自然数なら問題ないけど、整数だからね
0960デフォルトの名無しさん2012/05/28(月) 21:41:12.33
f(f(x)) = -x
なので
f(f( f(f(x)) )) = x

引数が整数型なので戻り値も整数型
オブジェクトもタプルも複素数も使えない

分かんね
0961デフォルトの名無しさん2012/05/28(月) 21:58:10.67
こんな感じかな。

f 0 = 0
f k | k > 0 = if odd k then k+1 else 1-k
f k = - f (-k)
0962デフォルトの名無しさん2012/05/28(月) 21:59:05.84
>>952
たぶんこういうのを求めてはいないのだろうけど、Squeak Smalltalk で。

Integer >> f
   | selectors |
   selectors := #(negated yourself).
   thisContext method literals first swap: 1 with: 2.
   ^self perform: selectors first

1 f f "=> -1 "
2 f f "=> -2 "
3 f f "=> -3 "
0963デフォルトの名無しさん2012/05/28(月) 22:02:39.76
あ、いかん。負数の実行例を忘れた。

-1 f f "=> 1 "
-2 f f "=> 2 "
-3 f f "=> 3 "
0964デフォルトの名無しさん2012/05/28(月) 22:15:18.79
>961が正攻法なんだろうけど、>962も面白いな。
0965デフォルトの名無しさん2012/05/28(月) 22:18:46.71
>>961と基本的に一緒だけど

f x = (-1) ^ abs x * x - signum x


> map (f . f) [-5..5]
[5,4,3,2,1,0,-1,-2,-3,-4,-5]
0966デフォルトの名無しさん2012/05/29(火) 17:56:51.52
-----------まとめ----------
「馬鹿は死なねば治らないのであり、だからこそアナトール・フランスは
『愚かな者は、邪悪な者よりも忌まわしい』と言ったのだ。
 邪悪な者は休むときがあるが、愚かな者はけっして休まないからである。」
(ホセ・オルテガ・イ・ガセット 1883〜1955)

http://toro.2ch.net/test/read.cgi/tech/1336122899/247
>ゲームは作らんから知らんが、
224 == 247 == 704 == 717 == http://logsoku.com/thread/toro.2ch.net/tech/1335361193/46
口癖はコンポジション、ミサイルとホーミングミサイルの設計について1ヶ月間も考え続けてる
http://toro.2ch.net/test/read.cgi/tech/1336122899/772
>ゲーム作らなくてもお前よりマトモ
タスクの実行順序を意識しないとゲームが作れない(笑)
http://toro.2ch.net/test/read.cgi/tech/1336122899/767
敵機 → プレイヤー の順序でタスクを実行するとタスクがぶっ壊れる
OOを得意げに語っているつもりが、やっている事が20年前のC言語だったという事実
バイナリの書き換えがわからない
コンパイラ言語のことをコンパイル言語とか言っちゃう
タイプミスの数々、右手の人差し指と中指をケガしてる模様
http://toro.2ch.net/test/read.cgi/tech/1336122899/190
http://toro.2ch.net/test/read.cgi/tech/1336122899/297
http://toro.2ch.net/test/read.cgi/tech/1325246820/837-839
http://toro.2ch.net/test/read.cgi/tech/1336122899/318-320
http://toro.2ch.net/test/read.cgi/tech/1336122899/332-334
http://toro.2ch.net/test/read.cgi/tech/1336122899/818
http://toro.2ch.net/test/read.cgi/tech/1336122899/956
0967デフォルトの名無しさん2012/05/29(火) 20:37:17.13
このスレもそろそろ終わりか

関数型言語を覚えられない頭の可哀想なPGだけが
オブジェクト指向言語を使う、でFA
0968デフォルトの名無しさん2012/05/29(火) 21:34:33.15
お前ん中ではなwwwww
0969デフォルトの名無しさん2012/05/29(火) 22:06:07.06
関数型の駄目なところやその使い手のコミュ障っぷりはよく分かったけど
メリットはいまいち見えてこなかったなぁ…
0970デフォルトの名無しさん2012/05/29(火) 22:48:47.42
自分の脳に障害があると疑ったほうがいいぞwwwww
0971デフォルトの名無しさん2012/05/30(水) 01:36:49.43
でも手続き型のほうが副作用を簡単に書けて便利じゃないですか。
0972デフォルトの名無しさん2012/05/30(水) 03:14:23.10
手続き型言語は確かに沢山あるけど、オブジェクト指向言語なんて
呼べるものはほとんどないのではないかな。
0973デフォルトの名無しさん2012/05/30(水) 06:25:18.37
>>971
馬鹿には関数型言語で副作用を簡単に書く方法が分からないだけ


関数型言語PG:オブジェクト指向言語も関数型言語も使えて、関数型言語を選択
オブジェクト指向言語PG:オブジェクト指向言語しか使えない

優劣を語っていいのは両方使える奴だけだろ
0974デフォルトの名無しさん2012/05/30(水) 07:14:21.77
>>971
gotoを使った方が簡単に分岐できて便利。
グローバル変数を使った方が簡単に参照できて便利。

君の言ってる事はこれと同レベル。
0975デフォルトの名無しさん2012/05/30(水) 08:39:09.06
>>974
gotoは無くせるが
副作用はなくせない。

アプリの目的は副作用を起こすことなんだから。
0976デフォルトの名無しさん2012/05/30(水) 08:47:28.20
>>975
その理由付けはグローバル変数擁護と同じ。
純粋関数型言語以外は、あらゆる関数(たとえば三角関数とかの数学関数)に、
不必要な(有害かもしれない)副作用を起こす余地を与えてしまっている。
0977デフォルトの名無しさん2012/05/30(水) 08:57:57.39
>>976
純粋関数型はその発想自体はいいと思うが
ちょっと方向性がおかしい気がするんだよなあ
まあ、そもそもの目的が実用よりも研究なんで仕方ないが
0978デフォルトの名無しさん2012/05/30(水) 09:29:01.88
てんでばらばらに実装ができて、これじゃあ研究はともかく実用には困るよね、ということで
Haskellを作ろう、という話になったわけで、25年くらい認識が遅れてますね。
0979デフォルトの名無しさん2012/05/30(水) 10:43:31.88
まぁHaskellが日本の業務アプリで流行ることはあるまい。
副作用を封じ込めたと言っても、コードのほとんどが、その副作用処理なんだから。Haskellerも泣くだろう。
0980デフォルトの名無しさん2012/05/30(水) 14:53:25.54
だって、最近はパソコンですら、もうね、
メモリ16GとかHDD2TBとかだよ。
メモリもHDDも一度書き込んだものは変更不可という、CD-Rのような
動作ではないから、制御するなら副作用が自然だよ。
更新するときは新たに別領域を確保してってのもあるけど、
別領域じゃ意味の無い場合も多いよな。
だったら、副作用はどうしても必要と考えて、
無くすのではなく、有ることを前提として織り込んで、
上手く付き合うことを念頭に設計されている、
手続き型言語のほうが現実的だよね。
0981デフォルトの名無しさん2012/05/30(水) 14:56:39.43
それに副作用と戦うという意味では、
DBのトランザクションの方が全うに見える。
関数型言語は単に副作用を無くしただけ。
臭いものに蓋しただけ。
0982デフォルトの名無しさん2012/05/30(水) 17:02:57.95
> あらゆる関数(たとえば三角関数とかの数学関数)に、
> 不必要な(有害かもしれない)副作用を起こす余地を与えてしまっている。

結局これには反論できないわけねw
0983デフォルトの名無しさん2012/05/30(水) 17:03:30.53
>>980
> メモリ16GとかHDD2TBとかだよ。

ストレージが大きいほどimmutableなデータ型は使い易くなるだろ。
更新するたび新しい領域使っても大丈夫になるんだから。
もっとも、更新するたび全コピーするような馬鹿な設計にはなってないがな。

関数型憎しで主張が支離滅裂になってるぞ。
0984デフォルトの名無しさん2012/05/30(水) 17:08:32.05
>>981
> 関数型言語は単に副作用を無くしただけ。

何度も何度も「関数型言語でも副作用は書ける」と言われていて
実際に副作用を持つコードもスレに張られているのに
お前は何時になったら学ぶんだ?

お前は手続き型&副作用が大好きだが、お前の脳は
一度書き込んだら修正不可能らしいな。
0985デフォルトの名無しさん2012/05/30(水) 17:34:07.94
それをいうなら、手続き型でも副作用を無くすスタイルは取れる。
その上で、副作用を伴う場合は、ごく自然に当たり前のように
副作用を表現できる。
0986デフォルトの名無しさん2012/05/30(水) 18:01:04.68
Haskellで副作用が書けることだけは知ってるけど
各副作用に対して、スコープやアクセス権の管理はどこまで出来るん?
0987デフォルトの名無しさん2012/05/30(水) 18:14:13.49
>>986
逆に、管理出来ていない副作用ってなんなの?
0988デフォルトの名無しさん2012/05/30(水) 18:29:49.51
>>987
もしかして、その概念すら無いのか?
だとしたら「副作用を管理できる」とは言えなさそうだな
0989デフォルトの名無しさん2012/05/30(水) 19:06:22.93
コンピュータ上のほとんどのリソースが副作用を前提としているのだから、
手続き型がベースとなるのは当たり前なのです。
関数型は適用できるところだけで使ってくださいなオマケ機能。

Aというファイルを更新してファイル名Bで保存する。
たしかにAについてimmutableは守られたが、
Aの最新版がBであることを知っているのは、本人だけ。
周知徹底の為には全てをトップダウンで済ませる必要がある。
余計に面倒だから普通は上書きを使う。
0990デフォルトの名無しさん2012/05/30(水) 19:16:46.46
>>988
そうだね。管理したいと思わないものは管理できない。
986は、なぜ管理したいと思ったのかな?
0991デフォルトの名無しさん2012/05/30(水) 19:18:56.91
2chのような掲示板を考えてみよう。
複数人の人間が非同期に書き込む。
書き込み内容は、書き込み時間順に整理される。
掲示板は非同期吸収のためのバッファとして作用する。
こういった現象を表現するのに関数型は向いていない。
が、現実にはありふれている。
コンピュータには沢山のマイクロチップが載ってるし、
マルチプロセスだし、マルチスレッドだって使う。
おおよそ殆どのことは非同期で、
共通のバッファを持つことで同期処理をする。
バッファは当然immutableであってはならない。
0992デフォルトの名無しさん2012/05/30(水) 19:29:38.61
次スレ候補

【アンチ】関数型言語は使えない【玩具】 2
http://toro.2ch.net/test/read.cgi/tech/1330429547/l50

【スピード対決】関数型 VS オブジェクト指向
http://toro.2ch.net/test/read.cgi/tech/1334471667/l50
0993デフォルトの名無しさん2012/05/30(水) 19:50:50.33
>>985
> それをいうなら、手続き型でも副作用を無くすスタイルは取れる。

その主張は「動的型付け言語でも人間が気をつけてテストすれば
型安全なプログラムを書ける」と同程度の意味しかない。
0994デフォルトの名無しさん2012/05/30(水) 19:57:11.64
>>991
> マルチプロセスだし、マルチスレッドだって使う。
> おおよそ殆どのことは非同期で、
> 共通のバッファを持つことで同期処理をする。

immutableなデータは排他制御しなくても
複数のスレッドで共有できる。
そんなことも知らんのか。
0995デフォルトの名無しさん2012/05/30(水) 20:15:21.10
いやだからmutableなデータという前提の話だろ?
0996デフォルトの名無しさん2012/05/30(水) 20:22:43.61
それなら掲示板のようなappend-onlyで可能な例を出すなよ
0997デフォルトの名無しさん2012/05/30(水) 20:42:35.05
どちらにしてもmutexはmutable。
0998デフォルトの名無しさん2012/05/30(水) 21:59:19.64
副作用の有無を型で表現できる言語 vs 副作用の無いことを型で表現出来ない言語

最初から勝負になってない
0999デフォルトの名無しさん2012/05/30(水) 22:30:10.79
Haskellの欠点

IOモナドで挫折するレベルの低能が使っても
副作用を書く事すら出来ない
1000デフォルトの名無しさん2012/05/30(水) 22:37:08.75
関数型言語を覚えられない頭の可哀想なPGだけが
手続き型オブジェクト指向言語を使う、でFA
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。