x,y,z -> V をx -> (y->(z->V)) に変換するのがカリー化。x,y,z-> Vのyに値を束縛して結果的にx,z->Vという関数になるのが部分適用。どこが同じなんだろうか。
2011-09-04 20:56:43@glad2121 @ryoasai74 javascriptとか型が無くて x,y->zとx->y->zを同一視しているためにごっちゃに見えるのかもしれませんね。でもそれは「型」が無い事でそういう解釈になるのであって、元から一緒の概念と捉えるのは良くないと思います。
2011-09-04 21:02:28@glad2121 あ、そうでしたっけ?あーーーなんか、PartialFunctionがらみの訳で質問投げてた覚えがありますw
2011-09-04 21:03:26と、検索してみると @kmizu 氏のブログで明快に述べられていた。 | カリー化!=部分適用 http://ow.ly/6kYe3
2011-09-04 21:06:35@everpeace カリー化された関数は合成関数になってパラメータを逐次適用して呼び出していくことになるので、実行時の処理の流れを考えると部分適用と混同されるのは理解できると思いますが。静的な型の世界で考える人と実行時の動的な振る舞いしか考えない人に違いでは。
2011-09-04 21:11:57@ryoasai74 @everpeace この prototype.js の例は、カリー化して部分適用するメソッドじゃないですか?だから curry というメソッド名は必ずしも間違っていない。カリー化しないと足りない引数はデフォルト値が使われて全引数が評価されるのでは?
2011-09-04 21:13:40Ruby Currying - Khaled alHabache’s official blog http://t.co/giRqBpI
2011-09-04 21:21:31Practically Groovy: Functional programming with curried closures http://t.co/v8GF6mk
2011-09-04 21:23:49@naka_aki_spl そうなのですよ。だから、Groovyのcurry関数という名称が間違いとは言われますが、コンテキスト境界が違うのだからよいのではとも思うのです。Groovy流の使い方は結構市民権を得ているように思われます。
2011-09-04 21:26:36@megascus 結果が別の関数なのか、関数を評価した値なのかという違いと理解していますが。カリー化の学術的な定義では、全パラメータがバインドされるまで結果は別の関数となるわけですが、部分適用の意味では単に引数の数が減った関数が得られ、その関数は一般に合成関数でない。
2011-09-04 21:37:20部分適用とcurryの混同は、関数型ということを明示的にうたっていないGroovy、Ruby、JSなどの世界では一般的なように思われますね。つまり、このコンテキストではcurryとは部分適用のことであると考えてよい?
2011-09-04 21:44:57http://t.co/2pcLWq0 んー、いや。カリー化!=部分適用、ってのはまず事実としてあるのに、用語の誤用を広めといて、それでいいじゃん、という事に私は賛同しないです。
2011-09-04 22:06:37もちろん、部分適用に相当する用語が無かったなら話はわかりますが、そういう用語はあるのだから、それ使えばいいじゃんと思うわけです。この手の話はカリー化に限らず繰り返されてきましたが、カリー化に関しては非常にまぎらわしいので、止めて欲しいなー、というのが本音です。
2011-09-04 22:08:09ただ、Groovyのみを批判対象とした事はよくなかったと思います。カリー化と部分適用の誤用がここまで広まっていると思わず、Groovy界隈限定の話だと思っていました。この点はすいません。 #groovy
2011-09-04 22:09:04用語の誤用に関しては色々スタンスはあると思うのですが、この件では、カリー化=部分適用、という誤解が広まることによって、カリー化という用語の意味が上書きされてしまって、カリー化という用語を(本来の意味で)実質的に使えなくなる事を私は危惧しています。
2011-09-04 22:12:43Rubyでカリー化する方法をググったら出てきたのがすべて部分適用でキレそうになったことがあるから、元がちゃんとある用語の誤用はイクナイと思うのです
2011-09-04 22:13:47