せっかく関数やったので、ちょっと関数型言語っぽいことしてみようと思います。その名もカリー化。
カリー化とは"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
なんか色々難しい気がするけど、要は関数の一部の引数を固定化できるみたいなもんだと個人的に理解してます。
はぁ、関数型頭になじむまで時間かかるわぁ。