かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

手軽なスクリプト言語としての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

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