2013/08/07

[Haskell]Haskell のカリー化について考えた

Haskell のカリー化について

「すごいHaskellたのしく学ぼう!」に、カリー化と部分適用は完全に理解しておいてくださいと書かれていたのでしっかり学ぶ努力をしてみる。

下記のような関数があったとして、

myAdd :: Integer -> Integer -> Integer
myAdd x y = x + y

(myAdd 4) の返り値は、

myAdd' :: Integer -> Integer
myAdd' y = x + y
    where x = 4

と同等の関数であるという事なのだろうか?

いや、参考文献を見る限り違うようだ。

これは、「カリー化して部分適用」したという事らしい。

Integer -> Integer -> Integer を、 Integer -> (Integer -> Integer) と (Integer -> Integer) の 2 つの関数に分解するのが カリー化という事か。

Haskell なら、すべての関数を処理系が自動で変換してくれる。

Java で、オレオレ Add 関数のカリー化をする場合こんな感じになるのかな?

StudyCurry.java(https://github.com/mikoto2000/MiscellaneousStudy/blob/master/java/StudyCurry/src/jp/dip/oyasirazu/study/curry/StudyCurry.java)

とりあえず、「関数の分解がカリー化」、「具体的に数値を入れると部分適用」という印象。

参考文献

カリー化と部分適用の違いと誤用 - Togetter(http://togetter.com/li/183700)

カリー化 != 部分適用 - ((プログラミング | 形式) 言語) について書く日記(http://d.hatena.ne.jp/kmizushima/20091216/1260969166)

カリー化 - Wikipedia(http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)

StudyCurry.java(https://github.com/mikoto2000/MiscellaneousStudy/blob/master/java/StudyCurry/src/jp/dip/oyasirazu/study/curry/StudyCurry.java)