カリー化

MLでの関数定義は以下のようになる。

let add a b = a + b

これは以下のように使うと

add 3 4

で7になる。

この関数は2引数とると整数一つ返す。別の記法

let add = fun a b -> a + b

と同じで2引数とる以下の関数(MLは関数型言語なのでモノはすべて関数扱い)をaddとラベル付けたものということになる。

さらにいうと

let add = fun a -> (fun b -> a + b)

と同じである(二つ目のfunの周りの()は省略可能)。書き方をまぜると

let add a = fun b -> a + b

ともできる(実のところこれが一番理解しやすいかも)。

つまりaddは1引数の関数f1であり、その関数は1引数の関数f2で、f1の引数とf2の引数を足すものである。

使い方のほうでも、

(add 3) 4

という風に書ける。もちろん

let add_three = add 3

なんてことも可能。
こういうことができることをカリー化と呼ぶんだったかな。

実のところ+は(+)で普通の関数と同じ扱いになるんで

let add = (+)

でよかったりする。