カリー化と部分適用の違いと誤用

51
前へ 1 2 ・・ 5 次へ
Shingo Omura ⎈ @everpeace

x,y,z -> V をx -> (y->(z->V)) に変換するのがカリー化。x,y,z-> Vのyに値を束縛して結果的にx,z->Vという関数になるのが部分適用。どこが同じなんだろうか。

2011-09-04 20:56:43
GLAD!! @glad2121

@everpeace おーっ、さすが。分かりやすい説明。

2011-09-04 20:58:41
GLAD!! @glad2121

@everpeace まぁ、でも Programming Scala の原著でも間違ってたしね。翻訳では訂正したけど。

2011-09-04 21:01:08
Shingo Omura ⎈ @everpeace

@glad2121 @ryoasai74 javascriptとか型が無くて x,y->zとx->y->zを同一視しているためにごっちゃに見えるのかもしれませんね。でもそれは「型」が無い事でそういう解釈になるのであって、元から一緒の概念と捉えるのは良くないと思います。

2011-09-04 21:02:28
Shingo Omura ⎈ @everpeace

@glad2121 あ、そうでしたっけ?あーーーなんか、PartialFunctionがらみの訳で質問投げてた覚えがありますw

2011-09-04 21:03:26
Shingo Omura ⎈ @everpeace

と、検索してみると @kmizu 氏のブログで明快に述べられていた。 | カリー化!=部分適用 http://ow.ly/6kYe3

2011-09-04 21:06:35
Ryo Asai @ryoasai74

@everpeace カリー化された関数は合成関数になってパラメータを逐次適用して呼び出していくことになるので、実行時の処理の流れを考えると部分適用と混同されるのは理解できると思いますが。静的な型の世界で考える人と実行時の動的な振る舞いしか考えない人に違いでは。

2011-09-04 21:11:57
GLAD!! @glad2121

@ryoasai74 @everpeace この prototype.js の例は、カリー化して部分適用するメソッドじゃないですか?だから curry というメソッド名は必ずしも間違っていない。カリー化しないと足りない引数はデフォルト値が使われて全引数が評価されるのでは?

2011-09-04 21:13:40
Ryo Asai @ryoasai74

Ruby Currying - Khaled alHabache’s official blog http://t.co/giRqBpI

2011-09-04 21:21:31
ゆとり🇺🇦 @megascus

あー、部分適用が直ちに評価されるってそういうことか。うーん・・・・すぐに使われない場合に差が出てくるのかなぁ。

2011-09-04 21:22:04
非実在naka aki @naka_aki_spl

@ryoasai74 クロージャと無名関数とか、オブジェクトとクラスとか

2011-09-04 21:23:00
Ryo Asai @ryoasai74

Practically Groovy: Functional programming with curried closures http://t.co/v8GF6mk

2011-09-04 21:23:49
Ryo Asai @ryoasai74

@naka_aki_spl そうなのですよ。だから、Groovyのcurry関数という名称が間違いとは言われますが、コンテキスト境界が違うのだからよいのではとも思うのです。Groovy流の使い方は結構市民権を得ているように思われます。

2011-09-04 21:26:36
Ryo Asai @ryoasai74

@megascus 結果が別の関数なのか、関数を評価した値なのかという違いと理解していますが。カリー化の学術的な定義では、全パラメータがバインドされるまで結果は別の関数となるわけですが、部分適用の意味では単に引数の数が減った関数が得られ、その関数は一般に合成関数でない。

2011-09-04 21:37:20
Ryo Asai @ryoasai74

部分適用とcurryの混同は、関数型ということを明示的にうたっていないGroovy、Ruby、JSなどの世界では一般的なように思われますね。つまり、このコンテキストではcurryとは部分適用のことであると考えてよい?

2011-09-04 21:44:57
ゆとり🇺🇦 @megascus

間違っている人の例になっているなあ(∩´∀`)∩ワーイ

2011-09-04 22:02:27
kmizu @kmizu

http://t.co/2pcLWq0 んー、いや。カリー化!=部分適用、ってのはまず事実としてあるのに、用語の誤用を広めといて、それでいいじゃん、という事に私は賛同しないです。

2011-09-04 22:06:37
GLAD!! @glad2121

@ryoasai74 Groovy 界隈では、高階関数のことを合成関数と言うのですか?

2011-09-04 22:07:38
kmizu @kmizu

もちろん、部分適用に相当する用語が無かったなら話はわかりますが、そういう用語はあるのだから、それ使えばいいじゃんと思うわけです。この手の話はカリー化に限らず繰り返されてきましたが、カリー化に関しては非常にまぎらわしいので、止めて欲しいなー、というのが本音です。

2011-09-04 22:08:09
kmizu @kmizu

ただ、Groovyのみを批判対象とした事はよくなかったと思います。カリー化と部分適用の誤用がここまで広まっていると思わず、Groovy界隈限定の話だと思っていました。この点はすいません。 #groovy

2011-09-04 22:09:04
しいたけ @yuroyoro

プログラミング言語の「コンテキスト境界」ってなんぞ?

2011-09-04 22:11:17
kmizu @kmizu

用語の誤用に関しては色々スタンスはあると思うのですが、この件では、カリー化=部分適用、という誤解が広まることによって、カリー化という用語の意味が上書きされてしまって、カリー化という用語を(本来の意味で)実質的に使えなくなる事を私は危惧しています。

2011-09-04 22:12:43
しいたけ @yuroyoro

Rubyでカリー化する方法をググったら出てきたのがすべて部分適用でキレそうになったことがあるから、元がちゃんとある用語の誤用はイクナイと思うのです

2011-09-04 22:13:47
前へ 1 2 ・・ 5 次へ