学びの日記

日々の勉強記録

Haskell | カリー化

Haskellのカリー化の勉強。

Haskellでn個の引数をとる関数にみえたものは、内部的には1つの引数をとる関数をn個適用した構造になっている。このように1つの引数の関数をネストさせることをカリー化という。

例えばxとyをたした結果を返す関数 add x y = x + y を考える。普通はadd 2 3と適用すると5が返る。実はこの関数はいわば内部的には (add x) y という形をしている。だから、add 2 3は、まず「2に与えられた数を足す関数」が返却され*1、それに3が適用されているという振る舞いになる。

このようにカリー化されているので、複数の引数を持つ関数に部分的に引数を与えて関数を取り出すことができる。これを部分適用という。

add 1はaddの部分適用だが、想像されるように連続して適用すれば次々と1を足せる。((add 1)((add 1) 2)は4である。部分適用したものを関数として取り出して使えるので、例えば map (add 1)[0,1,2]とか使える。結果は[1,2,3]である。

なかなか強力。次は、関数周りのそれ以外のネタ(ラムダ式、$、合成など)を勉強する予定。

*1:このように関数を返す関数を高階関数という