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

51
kmizu @kmizu

正直に言うと、Groovy自体は別に好きでも嫌いでもないのだけど、カリー化してないのにcurryとかいうメソッド名付けてたり(標準で)、概念の無理解が目立つ部分があって、その辺がちょっと…という思いがあったり。 #scalajp #groovy

2011-09-04 19:43:37
ふも @fumokmm

@kmizu 本当のカリー化とどう違うんでしたっけ?

2011-09-04 19:55:10
kmizu @kmizu

@fumokmm Groovyのアレは概念としては「部分適用」とかそう呼ばれるものになります。ちょっと次から違いを説明します。ちょっとわかりやすくするために型な話になります。 #groovy

2011-09-04 20:01:33
ふも @fumokmm

@kmizu なるほど、部分適用の方ですか。ちょっと私も勉強してみますね。ありがとうございます。

2011-09-04 20:02:40
kmizu @kmizu

@fumokmm で、Groovyのcurryって、 add = { x, y -> return x * y }; add.curry(2) とかいう風に使うわけですが、これはどう見てもカリー化じゃなくて部分適用だろ、とツッコミたくなるわけです。 #groovy

2011-09-04 20:06:43
ふも @fumokmm

@kmizu ですね、部分適用ですね。ちなみに add.curry(2) ってした場合、戻りの型は CurriedClosure という痛い名前になってますw

2011-09-04 20:09:28
Ryo Asai @ryoasai74

これも部分適用をcurryと称している例では。 / Prototype JavaScript framework: Function.curry http://t.co/7KLIBpG

2011-09-04 20:29:01
Ryo Asai @ryoasai74

ちなみに、Clojureでは部分適用は正確にpartial関数と呼ばれていたと思います。

2011-09-04 20:30:18
Ryo Asai @ryoasai74

The joy of clojureのP127に以下の説明があるのですが、これは正確なのかな。The use of partial differs from the notion of currying in a fundamental way...

2011-09-04 20:32:31
Ryo Asai @ryoasai74

A function built with partial will attempt to evaluate whenever it's given another argument...

2011-09-04 20:33:46
Ryo Asai @ryoasai74

A curried function on the other hand will return another curried function until it receives a pre-determined number of arguments ...

2011-09-04 20:34:42
Ryo Asai @ryoasai74

--- only then will it evaluate. Because Clojure allows functions of variable number of arguments, currying makes little sense.

2011-09-04 20:35:54
Ryo Asai @ryoasai74

つまり、3個の引数を取る関数をカリー化したものに1個の引数で呼び出すと直ちに評価されずに2個引数をとる別の関数が得られる。部分適用だと直ちに評価されてしまう。

2011-09-04 20:38:22
Ryo Asai @ryoasai74

誤用が広まって市民権を得るということもあるので、部分適用を一部の言語ではカリー化と呼ぶのは方言の一種ということでよいのではないでしょうかね。実際、プログラミングの世界ではよくあることに思われます。

2011-09-04 20:40:26
ゆとり🇺🇦 @megascus

部分適用って言葉があるのか。コンストラクタで一部の引数をとって、他の引数はメソッドで渡すって感じかなぁ。

2011-09-04 20:44:04
Shingo Omura ⎈ @everpeace

@ryoasai74 僕、それよくないと思います。使うならバウンデッドコンテキストを意識して利用してほしいです。groovy 界隈だけじゃないですか?その誤用って。他の昔からある関数型言語ではカリー化と部分適用をごっちゃにしてるのは少ない【気がします】が。

2011-09-04 20:44:06
Ryo Asai @ryoasai74

@everpeace 先に上げたJSのprototype.jsの例のように動的言語のコンテキストでは結構ごっちゃになって使われているようです。 http://t.co/ZwdNbg9

2011-09-04 20:46:43
Shingo Omura ⎈ @everpeace

でも、カリー化自体に、引数の束縛という動作は関係ない概念なのに、どこのだれが、部分適用とカリー化をごっちゃに言い出したんだろう?そもそも混用される概念じゃないと思うが。。。

2011-09-04 20:46:44
ゆとり🇺🇦 @megascus

@ryoasai74 boostのドキュメントを読むと、カリー化(第一引数のみ)を一般化したものが部分適用みたく見えますけれども、違うものなのでしょうか。 http://t.co/RTccJvS

2011-09-04 20:52:18
Ryo Asai @ryoasai74

この説明だと部分適用との違いがよくわからない? / カリー化 - Wikipedia http://t.co/WbHYJ5o

2011-09-04 20:52:35
GLAD!! @glad2121

@ryoasai74 何の文脈で話をしてるのか分かりませんが、「部分適用だと直ちに評価されてしまう」の意味がよく分かりません。f(x,y,x)=x+y+z に x=2 を部分適用すれば、g(y,z)=2+y+z となり、y,z は評価されないと思いますが。

2011-09-04 20:52:47
Shingo Omura ⎈ @everpeace

@ryoasai74 そうなんですか。完全な誤用ですね。。。。こんなん市民権得てたら怖いですね。カリー化は束縛なんて関係ない関数の型の話なのに。

2011-09-04 20:54:35
Ryo Asai @ryoasai74

Currying - Wikipedia, the free encyclopedia http://t.co/BkmtIVa

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

@everpeace が先に突っ込んでた…。(^^;)

2011-09-04 20:54:45
Ryo Asai @ryoasai74

The Uncarved Blog: Partial Function Application is not Currying http://t.co/c9L1bkQ

2011-09-04 20:55:14
1 ・・ 5 次へ