カリー化
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 = (+)
でよかったりする。