前スレ
http://toro.2ch.net/test/read.cgi/tech/1320743217/
探検
【アンチ】関数型言語は使えない【玩具】 2
■ このスレッドは過去ログ倉庫に格納されています
2012/02/28(火) 20:45:47.95
2012/03/02(金) 14:59:04.52
2012/03/02(金) 16:34:36.45
遅延評価って、一見全部読み込んでから一部だけ出力するって処理で、必要な分しか読み込まないってので、>>62の上のmyreverseはリストを反転する必要があるから、全部読み込んでるけど、下のaddlistをmytake 10 してる方は、最初の10要素分しか読み込まない
先行評価だと、全部読み込んでから始まるか、最初の10要素だけ読み込む様に書き分ける
ファイル処理とかで、書き分ける必要が無い事になる
とは言え、最近の言語なら、オブジェクトにその辺の処理を押し込んでそうだが
先行評価だと、全部読み込んでから始まるか、最初の10要素だけ読み込む様に書き分ける
ファイル処理とかで、書き分ける必要が無い事になる
とは言え、最近の言語なら、オブジェクトにその辺の処理を押し込んでそうだが
2012/03/02(金) 16:37:16.86
オーバーヘッドつーか、評価機構の構造自体が違うのに、
全体の処理時間が同じなわけがないだろjk
全体の処理時間が同じなわけがないだろjk
2012/03/02(金) 17:43:05.82
正格評価でもありとあらゆるところにdelayとforceを忍ばせれば
遅延評価になると思うんだけど
計算量が減るところだけ遅延評価にした方がやっぱりいいと思うんだよね
遅延評価になると思うんだけど
計算量が減るところだけ遅延評価にした方がやっぱりいいと思うんだよね
2012/03/02(金) 20:31:03.15
2012/03/02(金) 23:50:52.90
配列のreverseくらいならC++でも一行だな
std::copy(in.rbegin(), in.rend(), std::back_inserter(out));
std::copy(in.rbegin(), in.rend(), std::back_inserter(out));
2012/03/03(土) 00:36:28.38
最近の関数型って実装まで気にするような段階なんだな
はてなあたりの選民気取りが「haskellはCより速い(キリッ」とか言い始めたら俺もそろそろ関数型始めようかな
はてなあたりの選民気取りが「haskellはCより速い(キリッ」とか言い始めたら俺もそろそろ関数型始めようかな
2012/03/03(土) 05:11:01.91
速度稼ぐ必要があるコードだと結局はモナド頼りなんだろ?
関数型言語って名前捨てて”モナド型言語”とでも呼べばいいんじゃね?
関数型言語って名前捨てて”モナド型言語”とでも呼べばいいんじゃね?
100デフォルトの名無しさん
2012/03/03(土) 06:46:14.07 おめえらhaskell以外の話もしろよ
101デフォルトの名無しさん
2012/03/03(土) 06:54:33.70 遅延評価のコストについては、コンパイラの本とかに載ってることあるよ
102デフォルトの名無しさん
2012/03/03(土) 07:59:28.26 >>98 大学の研究のレベルから、一般はてな民が話題にするまで10年ぐらいだから、
おまえは常に10年遅れだけど、好きにすればいいと思うよwwww
おまえは常に10年遅れだけど、好きにすればいいと思うよwwww
103デフォルトの名無しさん
2012/03/03(土) 08:12:49.54 xmonadの影響で今になってX11プログラミングを始めた漏れが
8時(10分以上遅れ)をお知らせしますね
8時(10分以上遅れ)をお知らせしますね
104デフォルトの名無しさん
2012/03/03(土) 09:12:49.53 10年遅れどころかMLなら40年遅れHaskell直系のMirandaからでも30年遅れだろ
105デフォルトの名無しさん
2012/03/03(土) 10:58:06.61 作ればあるもん
106デフォルトの名無しさん
2012/03/03(土) 13:05:49.24 >>104
登場時期が基準とかおもちゃじゃあるまいし
登場時期が基準とかおもちゃじゃあるまいし
107デフォルトの名無しさん
2012/03/03(土) 13:19:05.21 ギークやらアルファブロガーやら呼ばれる人が話題する時点ではまだ玩具
それを使用する企業やそれなりの規模のオープンソースプロジェクトが
出始めるくらいから実用品だな
それを使用する企業やそれなりの規模のオープンソースプロジェクトが
出始めるくらいから実用品だな
108デフォルトの名無しさん
2012/03/03(土) 14:01:18.50 Javaと心中するのは自由ですから、他人を巻き込もうと必死にならないでねw
109デフォルトの名無しさん
2012/03/03(土) 14:10:19.50 定番の必死認定
110デフォルトの名無しさん
2012/03/03(土) 14:43:35.56 このスレでの関数型言語って純粋関数型言語(Haskell,Mirandaとか)だけ?
非純粋関数型言語(Lisp,R,OCamlとか)も含むの?
Haskellはよく知らないけどCommon Lispは実用かなって思って
非純粋関数型言語(Lisp,R,OCamlとか)も含むの?
Haskellはよく知らないけどCommon Lispは実用かなって思って
111デフォルトの名無しさん
2012/03/03(土) 15:00:07.62 アンチの脳内の都合で、その場により変わりますw
112デフォルトの名無しさん
2012/03/03(土) 15:05:20.65 >>111
あなたの認識ではどっちですか?
あなたの認識ではどっちですか?
113デフォルトの名無しさん
2012/03/03(土) 15:07:01.59 関数型言語に定義なんてないし的当だよ
一般的な定義は
・関数を実行時に生成できる
・関数を引数として渡せる
・関数を関数の戻り値として返せる
だと思うけど、最近は勝手に
・変数に一度しか代入できない
とかルールを付け加えたり好きかっていう人が増えたから
一般的な定義は
・関数を実行時に生成できる
・関数を引数として渡せる
・関数を関数の戻り値として返せる
だと思うけど、最近は勝手に
・変数に一度しか代入できない
とかルールを付け加えたり好きかっていう人が増えたから
114デフォルトの名無しさん
2012/03/03(土) 15:14:52.67 昔は、関数型言語と比べて手続き型言語は原始的で貧弱に思えたけど、
最近は手続き型言語もクロージャを取り込んで関数的にも書けるから、
そうなると実用上は手続き型言語で十分だと感じるけどな。
基本は手続き的に処理を書きつつ、コレクションの操作だけ map や filter,
reduce を使って関数的に書く。他人にも読みやすいコードを書こうとすれば
最終的にはそのくらいのところに落ち着くと思うけど。
>>108 みたいな「仮想ドカタ」を煽るのは現実が見えていないと思うなあ。
今時、職業プログラマだって C, Java だけじゃなくて JavaScript も Ruby も使うよ。
JavaScript で言えば、JQuery なんて発想がかなり関数的だと思うけど。
XML を対象に XPath でパターンマッチかけて filter やら map やら。
ほとんどそういう処理。
最近は手続き型言語もクロージャを取り込んで関数的にも書けるから、
そうなると実用上は手続き型言語で十分だと感じるけどな。
基本は手続き的に処理を書きつつ、コレクションの操作だけ map や filter,
reduce を使って関数的に書く。他人にも読みやすいコードを書こうとすれば
最終的にはそのくらいのところに落ち着くと思うけど。
>>108 みたいな「仮想ドカタ」を煽るのは現実が見えていないと思うなあ。
今時、職業プログラマだって C, Java だけじゃなくて JavaScript も Ruby も使うよ。
JavaScript で言えば、JQuery なんて発想がかなり関数的だと思うけど。
XML を対象に XPath でパターンマッチかけて filter やら map やら。
ほとんどそういう処理。
115デフォルトの名無しさん
2012/03/03(土) 15:19:10.49 >>113
上の3つだとJavaScriptやC++(functor)、C#(delegate)あたりも含まれるな
初代スレの1はむしろ参照透過性、変数に一度しか代入できないことの方を嫌ってるように見える
上の3つだとJavaScriptやC++(functor)、C#(delegate)あたりも含まれるな
初代スレの1はむしろ参照透過性、変数に一度しか代入できないことの方を嫌ってるように見える
116デフォルトの名無しさん
2012/03/03(土) 15:19:35.75117デフォルトの名無しさん
2012/03/03(土) 15:27:07.99 javascriptはschemeをC言語っぽい文法に直したものだろ
昔から関数型言語と言われているよ
昔から関数型言語と言われているよ
118デフォルトの名無しさん
2012/03/03(土) 15:27:17.91 Haskellなどで言う「関数」は、集合・写像ベースの概念だから、変数の書き換えに依存しないやり方のほうが関数を率直に表現出来るってだけの話だ。
Cにも同じ字面の「関数」があるが、関数型言語の関数と区別したい時は、サブルーチンと呼んだ方が実態に近い。
Cにも同じ字面の「関数」があるが、関数型言語の関数と区別したい時は、サブルーチンと呼んだ方が実態に近い。
119デフォルトの名無しさん
2012/03/03(土) 15:33:16.95 良い所とか取り込んで明確な境界が無くなくなってる面があるんですね
研究目的の言語の成果が実用目的の言語に適用されたと考えたら
必ずしも実用である必要は無いのかもしれませんね
研究目的の言語の成果が実用目的の言語に適用されたと考えたら
必ずしも実用である必要は無いのかもしれませんね
120デフォルトの名無しさん
2012/03/03(土) 15:33:41.38 >>117
それは違うかな。
「言われている」ではなく、
関数型言語を知っている人たちが JavaScript は関数型言語っぽいと
「言っている」が正しい表現じゃないかな。
少なくとも、
Ecma-262 の 4 Overview には
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment.
と書いてあるんだから、何言語かと一つに決めるなら、
明らかにオブジェクト指向言語でしょ。
それは違うかな。
「言われている」ではなく、
関数型言語を知っている人たちが JavaScript は関数型言語っぽいと
「言っている」が正しい表現じゃないかな。
少なくとも、
Ecma-262 の 4 Overview には
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment.
と書いてあるんだから、何言語かと一つに決めるなら、
明らかにオブジェクト指向言語でしょ。
121デフォルトの名無しさん
2012/03/03(土) 15:40:05.10 >>119
「何ができるか」って意味なら差はどんどん無くなってる
だが、他人のコードを読むときには「何ができないか」ってのも重要で、
そこが手続き型言語と関数型言語では違う
わざわざコードを読んで副作用が無いか目でチェックしなくても
言語仕様で保証されてるなら読むのが楽になる
OOPのアクセス修飾子なんかと同じだな
「何ができるか」って意味なら差はどんどん無くなってる
だが、他人のコードを読むときには「何ができないか」ってのも重要で、
そこが手続き型言語と関数型言語では違う
わざわざコードを読んで副作用が無いか目でチェックしなくても
言語仕様で保証されてるなら読むのが楽になる
OOPのアクセス修飾子なんかと同じだな
122デフォルトの名無しさん
2012/03/03(土) 15:42:52.61 >>120
http://www.ecmascript.org/es4/spec/overview.pdf
ここの4ページにはこうある
ECMAScript 4th Edition (ES4) is a multi-paradigm programming language that is evolved from the
3rd Edition2 (ES3), which in turn is based on JavaScript3, a programming language for the web developed at
Netscape Communications Corporation starting in 1995.
ES3 is a simple, highly dynamic, object-based language that takes its major ideas from the languages Self
and Scheme.
http://www.ecmascript.org/es4/spec/overview.pdf
ここの4ページにはこうある
ECMAScript 4th Edition (ES4) is a multi-paradigm programming language that is evolved from the
3rd Edition2 (ES3), which in turn is based on JavaScript3, a programming language for the web developed at
Netscape Communications Corporation starting in 1995.
ES3 is a simple, highly dynamic, object-based language that takes its major ideas from the languages Self
and Scheme.
123デフォルトの名無しさん
2012/03/03(土) 15:49:23.32124デフォルトの名無しさん
2012/03/03(土) 17:26:19.51 何でも関数型言語にしたがる香具師がいるな…
125デフォルトの名無しさん
2012/03/03(土) 20:52:56.07 関数型言語の判断基準について、整理してみた。大きく3つのグループに分類できる。
・関数型言語(誰も文句無し)
・関数型プログラミングが可能な言語
・それ以外の手続き型言語
FP
---- 壁0. 変数の壁 ----
Haskell
---- 壁1. 純粋性(副作用)の壁 ----
SML/OCaml
---- 壁2. 型推論の壁 ----
Scheme
---- 壁3. 末尾再帰最適化の壁 ----
========<< 越えられない壁 >>========
Smalltalk/Ruby
---- 壁4. 条件判定式/局所宣言式の壁 ----
Perl/Python/JavaScript
---- 壁5. クロージャ/ラムダ式の壁 ----
========<< 越えられない壁 >>========
C/C++/Java...etc
なお、このカキコは「関数型言語Part5」スレの過去カキコ(283-335)を編集したもの
議論の参考になればと思う
・関数型言語(誰も文句無し)
・関数型プログラミングが可能な言語
・それ以外の手続き型言語
FP
---- 壁0. 変数の壁 ----
Haskell
---- 壁1. 純粋性(副作用)の壁 ----
SML/OCaml
---- 壁2. 型推論の壁 ----
Scheme
---- 壁3. 末尾再帰最適化の壁 ----
========<< 越えられない壁 >>========
Smalltalk/Ruby
---- 壁4. 条件判定式/局所宣言式の壁 ----
Perl/Python/JavaScript
---- 壁5. クロージャ/ラムダ式の壁 ----
========<< 越えられない壁 >>========
C/C++/Java...etc
なお、このカキコは「関数型言語Part5」スレの過去カキコ(283-335)を編集したもの
議論の参考になればと思う
126デフォルトの名無しさん
2012/03/03(土) 21:14:44.32 末尾再帰最適化とか、マジ関係無いだろ
実装上の話だろ
実装上の話だろ
127デフォルトの名無しさん
2012/03/03(土) 21:47:46.75 GCC(C/C++) → 末尾再帰最適化あり
あとC++のboost::lambda(ラムダ式)とはどうなんだろうか
言語自体に直接ラムダ式があるわけじゃないけど
boost::lambdaとスマートポインタでクロージャも作れるらしい
壁4はよく分からない
あとC++のboost::lambda(ラムダ式)とはどうなんだろうか
言語自体に直接ラムダ式があるわけじゃないけど
boost::lambdaとスマートポインタでクロージャも作れるらしい
壁4はよく分からない
128125
2012/03/03(土) 22:07:55.69 >>126
関数型言語にとってリストが最も基本的な複合データ型であることは、
誰もが認めることだろう
でも末尾再帰最適化が実装されていない言語の多くでは、
可変長配列(RubyであればArrayクラス)でリストを代用している
もしも、これを真面目に「ドット対の連なり」としてリストを定義して
その操作を再帰関数で定義した場合、ちょっとしたデータ量であっても
簡単にスタックオーバーフローが発生してしまう
だから、関数型言語で書かれたコードを末尾再帰最適化が実装されていない言語へ
移植しようとした場合、再帰ではなくfor/while文のような手続き型構文を使わざるをえない
これは(末尾再帰最適化という)実装がプログラミングスタイルに大きな影響を与えるという
典型的な一例であると思う
関数型言語にとってリストが最も基本的な複合データ型であることは、
誰もが認めることだろう
でも末尾再帰最適化が実装されていない言語の多くでは、
可変長配列(RubyであればArrayクラス)でリストを代用している
もしも、これを真面目に「ドット対の連なり」としてリストを定義して
その操作を再帰関数で定義した場合、ちょっとしたデータ量であっても
簡単にスタックオーバーフローが発生してしまう
だから、関数型言語で書かれたコードを末尾再帰最適化が実装されていない言語へ
移植しようとした場合、再帰ではなくfor/while文のような手続き型構文を使わざるをえない
これは(末尾再帰最適化という)実装がプログラミングスタイルに大きな影響を与えるという
典型的な一例であると思う
129デフォルトの名無しさん
2012/03/03(土) 22:11:49.10130デフォルトの名無しさん
2012/03/03(土) 22:12:39.97131デフォルトの名無しさん
2012/03/03(土) 22:41:56.15 リストは副作用を嫌う関数的プログラミングがLISPから借りてきた実装上の「逃げ」。
末尾再帰最適化でループの代用にしたのと根っこは同じ。
末尾再帰最適化でループの代用にしたのと根っこは同じ。
132デフォルトの名無しさん
2012/03/03(土) 22:56:45.86 ま、実用を目指したコンピュータ言語なんてものは
全てが実装上の話になってしまうんだけどな。
全てが実装上の話になってしまうんだけどな。
133デフォルトの名無しさん
2012/03/04(日) 01:14:03.00 末尾再帰なんてC言語の教科書で知ったから
関数型言語と結びつけるイメージが全く沸かない
関数型言語と結びつけるイメージが全く沸かない
134デフォルトの名無しさん
2012/03/04(日) 03:15:06.28 128は本質をついている。
リストは再帰的データ構造を持つので、
再帰を反復の記述にとる関数型とは相性がいい。
リストは再帰的データ構造を持つので、
再帰を反復の記述にとる関数型とは相性がいい。
135デフォルトの名無しさん
2012/03/04(日) 03:45:32.27 関数型言語にとって副作用が無いことは
本質的なことなの?
そうだと言える根拠とかあるの?
MLやHaskellが設計された頃の流行りだった
だけじゃないの?
”副作用は悪”っていう思想は、古いアルゴリズムの
教科書にはよく載ってる
本質的なことなの?
そうだと言える根拠とかあるの?
MLやHaskellが設計された頃の流行りだった
だけじゃないの?
”副作用は悪”っていう思想は、古いアルゴリズムの
教科書にはよく載ってる
136デフォルトの名無しさん
2012/03/04(日) 05:47:41.38137デフォルトの名無しさん
2012/03/04(日) 05:50:20.88138デフォルトの名無しさん
2012/03/04(日) 09:08:06.01 >>137
宣言という言葉をあまり狭義に使うのはどうかな。
IBMの簡易言語RPG(現在バージョンはIVかな)は
Decision Tableを使って制御を行っているので、
昔は宣言型言語に分類されていた。同じ宣言でも
こうまで異なると問題だ。
宣言という言葉をあまり狭義に使うのはどうかな。
IBMの簡易言語RPG(現在バージョンはIVかな)は
Decision Tableを使って制御を行っているので、
昔は宣言型言語に分類されていた。同じ宣言でも
こうまで異なると問題だ。
139デフォルトの名無しさん
2012/03/04(日) 09:23:41.58 定義のことを宣言って言ってるだけじゃね?
英語でどうなんだか知らんけど。
英語でどうなんだか知らんけど。
140デフォルトの名無しさん
2012/03/04(日) 10:33:53.88 CTMCPすら知らずに妄想する隔離スレか。
141デフォルトの名無しさん
2012/03/04(日) 10:43:48.80 抽象度が高いことを示すコードが出てないんだが
pythonに作れなくて、Haskellに作れるものって何がある?
とりあえずHaskellでif関数自作できるとかはよく見かけるが
pythonに作れなくて、Haskellに作れるものって何がある?
とりあえずHaskellでif関数自作できるとかはよく見かけるが
142デフォルトの名無しさん
2012/03/04(日) 11:05:05.88 if関数ったって組み込みの(型クラスを含む)条件分岐機構を使わずには書けんだろ。
143デフォルトの名無しさん
2012/03/04(日) 11:39:11.04 >>140知らなかったので、検索して目次を眺めてみたが、スレタイのような議論をするなら読むべきかと思った。
144デフォルトの名無しさん
2012/03/04(日) 11:44:07.10 >>142 ARMなら条件分岐なしのコードにコンパイルできるんでね?
145デフォルトの名無しさん
2012/03/04(日) 11:48:48.15 >>142
へ?
パターンマッチとガードでごく普通の関数として書けるけど
型クラスなんて大仰なもん使わんよ
と言うか、ifが普通に書けるのが遅延評価と関数もファーストクラスの値っていう特徴の賜物じゃないか
if flg t f | flg == True = t
| flg == False = f
関数型言語は必ず値を返すって性質上、if elseしか許されないが
先行評価のだと、両方とも関数を受け取った時点で評価前に実行されちゃうから正しく動かない
(評価前に両方実行されて、評価後にどちらかが実行される)
へ?
パターンマッチとガードでごく普通の関数として書けるけど
型クラスなんて大仰なもん使わんよ
と言うか、ifが普通に書けるのが遅延評価と関数もファーストクラスの値っていう特徴の賜物じゃないか
if flg t f | flg == True = t
| flg == False = f
関数型言語は必ず値を返すって性質上、if elseしか許されないが
先行評価のだと、両方とも関数を受け取った時点で評価前に実行されちゃうから正しく動かない
(評価前に両方実行されて、評価後にどちらかが実行される)
146デフォルトの名無しさん
2012/03/04(日) 12:02:53.04 つーか、関数型言語の利点と言えば、バグが無いことを保障できるって事じゃね?
数学の証明で公式が永遠に正しいことを保障するのと同じで、関数にバグが無いこと保証できれば、その関数の使い方を間違わなければ、その関数が原因のバグは無いと保証できる
数学の証明で公式が永遠に正しいことを保障するのと同じで、関数にバグが無いこと保証できれば、その関数の使い方を間違わなければ、その関数が原因のバグは無いと保証できる
147デフォルトの名無しさん
2012/03/04(日) 12:08:56.91 分岐を関数で表現するのは難しくない。
T(x,y)=x
F(x,y)=y
IF(c,x,y)=c(x,y)
最後のは糖衣構文で、cはTかFが入る。
問題はこれを先行評価すると、
xの評価、yの評価、どっちかの選択と
進行してしまい、無駄な評価またはやっては
ならない評価をしてしまうことになる。
遅延評価では必要になるまで引数は評価されず、
c(x,y)にはxかyの一方しか含まれないので、
上記の問題は起こらない。
T(x,y)=x
F(x,y)=y
IF(c,x,y)=c(x,y)
最後のは糖衣構文で、cはTかFが入る。
問題はこれを先行評価すると、
xの評価、yの評価、どっちかの選択と
進行してしまい、無駄な評価またはやっては
ならない評価をしてしまうことになる。
遅延評価では必要になるまで引数は評価されず、
c(x,y)にはxかyの一方しか含まれないので、
上記の問題は起こらない。
148デフォルトの名無しさん
2012/03/04(日) 12:10:17.75 すでにコメントされていたか。
149デフォルトの名無しさん
2012/03/04(日) 13:14:45.06 元ネタ書いたの誰か知らんが >>125 は酷すぎる。
上下に並べている壁が、それぞれ軸が違う。
壁2は型システムの問題だろ。
壁4も意味不明。
末尾再帰最適化の有無を越えられない壁とか書いてるのもアホ丸出し。
末尾再帰になるような処理は手続き型なら最初からループで書く方が自然。
だから要らないだけ。
上下に並べている壁が、それぞれ軸が違う。
壁2は型システムの問題だろ。
壁4も意味不明。
末尾再帰最適化の有無を越えられない壁とか書いてるのもアホ丸出し。
末尾再帰になるような処理は手続き型なら最初からループで書く方が自然。
だから要らないだけ。
150デフォルトの名無しさん
2012/03/04(日) 13:24:51.24 型推論とオブジェクトの相性の悪さが問題だな
誤解を恐れずざっくり切るなら、
オブジェクト指向が適している分野に関数型言語は不適。
誤解を恐れずざっくり切るなら、
オブジェクト指向が適している分野に関数型言語は不適。
151デフォルトの名無しさん
2012/03/04(日) 14:09:20.29 せんせー、OCamlさんが泣いてます
152デフォルトの名無しさん
2012/03/04(日) 14:12:58.24153デフォルトの名無しさん
2012/03/04(日) 15:30:46.23 >>147
Smalltalkの宣伝乙w
Smalltalkの宣伝乙w
154デフォルトの名無しさん
2012/03/04(日) 16:33:15.37 一般論を書いたつもりだがどの部分がsmalltalk?
155デフォルトの名無しさん
2012/03/04(日) 16:34:41.05 一般論を書いたつもりだがどの部分がsmalltalk?
156デフォルトの名無しさん
2012/03/04(日) 17:05:02.03 T(x,y)=xがTrueクラスの定義
F(x,y)=yがTrueクラスの定義
IF(c,x,y)=c(x,y)がメソッドの動的束縛に相当した実装になっている。
具体的には、if式はifTrue:ifFalse:というメソッドで実装されている。
これがTrueクラスでは、第1引数のクロージャを評価するよう定義されていて、
Falseクラスでは、第2引数のクロージャを評価するよう定義されている。
クライアントコードでは例えば
x = y ifTrue: [do something] ifFalse: [ do something else]
というメッセージ式を評価する時に、
x=yがtrueならTrueクラスのifTrue:ifFalse:が束縛されて
第1引数の[do something]が評価される。([ ]で囲まれたものはクロージャ)
x=yがfalseならFalseクラスのifTrue:ifFalse:が束縛されて
第2引数の[do something else]が評価される。
F(x,y)=yがTrueクラスの定義
IF(c,x,y)=c(x,y)がメソッドの動的束縛に相当した実装になっている。
具体的には、if式はifTrue:ifFalse:というメソッドで実装されている。
これがTrueクラスでは、第1引数のクロージャを評価するよう定義されていて、
Falseクラスでは、第2引数のクロージャを評価するよう定義されている。
クライアントコードでは例えば
x = y ifTrue: [do something] ifFalse: [ do something else]
というメッセージ式を評価する時に、
x=yがtrueならTrueクラスのifTrue:ifFalse:が束縛されて
第1引数の[do something]が評価される。([ ]で囲まれたものはクロージャ)
x=yがfalseならFalseクラスのifTrue:ifFalse:が束縛されて
第2引数の[do something else]が評価される。
157デフォルトの名無しさん
2012/03/04(日) 17:09:34.66158デフォルトの名無しさん
2012/03/04(日) 17:15:42.28159デフォルトの名無しさん
2012/03/04(日) 17:58:15.02 悪いけどJava屋の俺からするとSmalltalkの人も同じだよ。
>上から目線で小馬鹿にする
>上から目線で小馬鹿にする
160デフォルトの名無しさん
2012/03/04(日) 18:26:49.16 どっちも原理主義者で純血主義者ですもんね
161デフォルトの名無しさん
2012/03/04(日) 18:31:16.56 ハスケラやSmallTalkはわかるがLISPerは純血主義の対極だろw
162デフォルトの名無しさん
2012/03/04(日) 18:32:18.55 LispもHaskellも習得のコストさえ無視できれば
言語自体には使う価値があるけど
Smalltalkには何も無い
言語自体には使う価値があるけど
Smalltalkには何も無い
163デフォルトの名無しさん
2012/03/04(日) 18:35:31.08 よほどSmallTalkに叩かれた暗い過去があるんだねw
もしかしてIDEスレじゃね?ぷぷぷ あのスレのジャバ厨は悲惨だったww
もしかしてIDEスレじゃね?ぷぷぷ あのスレのジャバ厨は悲惨だったww
164デフォルトの名無しさん
2012/03/04(日) 18:38:27.75 そんなにスモールトーク叩きたければ別スレ立てれば?
スレ違いウザw よほど悔しかったんだねww
スレ違いウザw よほど悔しかったんだねww
165デフォルトの名無しさん
2012/03/04(日) 18:52:32.40 Smalltalkを頭ごなしに馬鹿にする奴でSmalltalkをまともに使ったことある奴を見たことがない。
166デフォルトの名無しさん
2012/03/04(日) 18:52:47.01 Pharoがゴミ過ぎて笑える
玩具で喜んでて滑稽
玩具で喜んでて滑稽
167デフォルトの名無しさん
2012/03/04(日) 19:25:33.87 負け犬>>166の遠吠え
168デフォルトの名無しさん
2012/03/04(日) 19:31:38.94 「俺は世間の奴らとは違う」という自尊心を満たすために
マイナーなものを選択するという変な層がいるから性質が悪い。
そういう人にとっては「世間はJava」でなければ困るわけだ。
「RubyでもJavaScriptでも普通に関数的にも書ける」と言われると
「中には手続き型言語で関数的に書いている人もいるだろうが、
それは(俺と同じ)一部の先進的な層で、世間一般はJavaだろ」
という主張をしてくる。自分が特殊でありさえすれば何でもいいというね。
マイナーなものを選択するという変な層がいるから性質が悪い。
そういう人にとっては「世間はJava」でなければ困るわけだ。
「RubyでもJavaScriptでも普通に関数的にも書ける」と言われると
「中には手続き型言語で関数的に書いている人もいるだろうが、
それは(俺と同じ)一部の先進的な層で、世間一般はJavaだろ」
という主張をしてくる。自分が特殊でありさえすれば何でもいいというね。
169デフォルトの名無しさん
2012/03/04(日) 19:32:43.55 自己紹介乙としか言いようがないw
170デフォルトの名無しさん
2012/03/04(日) 19:36:03.72 関数型言語由来の機能で便利なところってのはクロージャとラムダ。
それはもう手続き型言語で普通に使える。
関数型言語の便利な機能は、
既にメインストリームである手続き型言語に取り込まれ、
今では世間一般のプログラマも当たり前に関数的な書き方をするようになっている。
めでたしめでたし。
現実的には、もうこれで終了してる話だろ。
それはもう手続き型言語で普通に使える。
関数型言語の便利な機能は、
既にメインストリームである手続き型言語に取り込まれ、
今では世間一般のプログラマも当たり前に関数的な書き方をするようになっている。
めでたしめでたし。
現実的には、もうこれで終了してる話だろ。
171デフォルトの名無しさん
2012/03/04(日) 19:40:26.99 パターンマッチは便利なので手続き型言語にも取り込んでほしい
で、パターンマッチは再帰と相性良いので、
ついでに末尾再帰最適化も取り込んでほしい
汎用的な関数から具体的な関数を定義するのに
カリー化は便利なので是非とりこんで欲しい
で、パターンマッチは再帰と相性良いので、
ついでに末尾再帰最適化も取り込んでほしい
汎用的な関数から具体的な関数を定義するのに
カリー化は便利なので是非とりこんで欲しい
172デフォルトの名無しさん
2012/03/04(日) 19:44:07.49173デフォルトの名無しさん
2012/03/04(日) 19:45:55.21 >汎用的な関数から具体的な関数を定義するのに
>カリー化は便利なので是非とりこんで欲しい
こういう奴にカリー化という包丁を渡すと
オレオレ高階関数ライブラリを作り始めて
メンテナンス不可能なコードを量産されるのがオチ。
>カリー化は便利なので是非とりこんで欲しい
こういう奴にカリー化という包丁を渡すと
オレオレ高階関数ライブラリを作り始めて
メンテナンス不可能なコードを量産されるのがオチ。
174デフォルトの名無しさん
2012/03/04(日) 19:46:26.79 逆にダックタイピングは便利なので関数型言語にも取り込んでほしい
175デフォルトの名無しさん
2012/03/04(日) 19:46:46.00 あ、型推論できないから取り込めませんね。失礼
176デフォルトの名無しさん
2012/03/04(日) 20:08:21.74177デフォルトの名無しさん
2012/03/04(日) 20:09:50.08 >>174はダックタイピングの誤用だな
178デフォルトの名無しさん
2012/03/04(日) 20:10:17.57179デフォルトの名無しさん
2012/03/04(日) 20:13:10.92 パターンマッチと再帰は無関係だし
視野が狭すぎ
視野が狭すぎ
180デフォルトの名無しさん
2012/03/04(日) 20:13:25.44 代数的データ型使わないのにパターンマッチがあっても何も嬉しくない
181デフォルトの名無しさん
2012/03/04(日) 20:34:02.85 代数データ型と再帰構造は直交する概念だろw
どこまで視野が狭いんだかw
どこまで視野が狭いんだかw
182デフォルトの名無しさん
2012/03/04(日) 20:41:34.43 >代数データ型と再帰構造は直交する概念だろw
>どこまで視野が狭いんだかw
何それ?
代数データ型を使って
再帰構造を表現することはできないって事?
>どこまで視野が狭いんだかw
何それ?
代数データ型を使って
再帰構造を表現することはできないって事?
183デフォルトの名無しさん
2012/03/04(日) 20:52:20.17 便利な機能が全部ある言語を選んだらHaskellになった
184デフォルトの名無しさん
2012/03/04(日) 20:56:43.28 いらない機能を全部つめこんだらSmalltalkになった
185デフォルトの名無しさん
2012/03/04(日) 21:41:23.88186デフォルトの名無しさん
2012/03/04(日) 21:48:35.10 >>156
ありがとうございます。
Smalltalkって、C++やJavaの先祖くらいにしか思っていなかったけれども、
結構おもしろいですね。FPとOOPはレイヤーを積み重ねると互いに相手を
模倣できるという話を聞いたことがあるが、Smalltalkを学習すると
その意味がわかるのではないかという気がした。
ありがとうございます。
Smalltalkって、C++やJavaの先祖くらいにしか思っていなかったけれども、
結構おもしろいですね。FPとOOPはレイヤーを積み重ねると互いに相手を
模倣できるという話を聞いたことがあるが、Smalltalkを学習すると
その意味がわかるのではないかという気がした。
187デフォルトの名無しさん
2012/03/04(日) 21:58:32.05 あちこちのスレを読んでいると、
Smalltalkの説明に対してだけ、丁寧な言葉でお礼が書き込まれることが多い。
この傾向が、とても面白いと思う。
Smalltalkの説明に対してだけ、丁寧な言葉でお礼が書き込まれることが多い。
この傾向が、とても面白いと思う。
188デフォルトの名無しさん
2012/03/04(日) 22:04:24.12 > 関数型言語由来の機能で便利なところってのはクロージャとラムダ。
> それはもう手続き型言語で普通に使える。
体験するにはどういう言語がいい?知っている範囲では、
C++11: lambdaはあるが、スコープにかんするオプションがいっぱいあって
頭痛がしてきた。
Fortran: Intel拡張に限り、内部手続きが渡せるのでクロージャが部分的に
はあるといえる。うっかり使ってしまうとSparcマシンに移したときに
がっくりくる。
> それはもう手続き型言語で普通に使える。
体験するにはどういう言語がいい?知っている範囲では、
C++11: lambdaはあるが、スコープにかんするオプションがいっぱいあって
頭痛がしてきた。
Fortran: Intel拡張に限り、内部手続きが渡せるのでクロージャが部分的に
はあるといえる。うっかり使ってしまうとSparcマシンに移したときに
がっくりくる。
189デフォルトの名無しさん
2012/03/04(日) 22:25:37.67 結局はどの言語を使うかではなく、関数型的な考え方書き方が出来るかどうか、が問題になってくんだろうかね?
190デフォルトの名無しさん
2012/03/04(日) 22:39:54.94 できなくても、ほとんど問題がないのが現実
191デフォルトの名無しさん
2012/03/05(月) 00:18:07.30■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「中国人の訪日熱は冷めた」 人気旅行先から日本外れる 14日で自粛呼びかけ1カ月 ★2 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★7 [蚤の市★]
- 最新版Z級クソ映画ランキングが決定! [牛丼★]
- 【STARTO ENTERTAINMENT】SUPER EIGHTの横山裕、フジ『ドッキリGP』ロケで全治2ヶ月の重傷 [Ailuropoda melanoleuca★]
- 「1800万円の売り上げゼロに…」中国インバウンドに特化の宿の今 ★2 [蚤の市★]
- 公用車カーナビのNHK受信料「全額免除を」 千葉市議会、国に制度創設求める意見書可決 [少考さん★]
- 【朗報】南鳥島のレアアース、中国産の「20倍の純度」青山繁晴氏「日本は資源大国」日本復活のファンファーレが鳴り響く! [673057929]
- 麻婆豆腐食べてる
- 【安倍の実】大誤算!日本企業、円安で苦しむ、、適正為替より大幅に乖離。助けて高市 [219241683]
- 愛国者「釘を使わない日本独自の伝統工法スゴイ!」X民「それ中国起源ですよ」→批判殺到 [834922174]
- 👊😅👊三☁😶‍🌫三⛅🏡
- コーヒー、来年3月から30パーセント値上げへ [709039863]
