かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

手軽なスクリプト言語としてのF# その3

せっかく関数やったので、ちょっと関数型言語っぽいことしてみようと思います。その名もカリー化。
カリー化とは"2引数の関数f(x, y)に対して、「gがfのカリー化」だとは、f(x, y) = g(x)(y) が常に成立すること"と説明されてたりしますが頭が痛くなります。ちょっと順を追ってみてみましょう。

// intを2つ受け取ってintを返す関数
let f x y = x + y

// f(10,100) = g(10)(100)
printfn "f(10, 100) = %d" (f 10 100)
// f(10)を評価した結果に(100)を渡してさらに関数呼び出しされてる
printfn "f(10)(100) = %d" (f(10)(100))

// つまりこんな感じに使える
// f 10の戻り値はint型を1つ受け取る関数なのだ
let g = f 10
printfn "g(100) = %d" (g 100)

実行結果は以下のような感じになります。

f(10, 100) = 110
f(10)(100) = 110
g(100) = 110

なんか色々難しい気がするけど、要は関数の一部の引数を固定化できるみたいなもんだと個人的に理解してます。
はぁ、関数型頭になじむまで時間かかるわぁ。