カリー化の概要
カリー化(= curriyng)とは、「複数の引数を取る関数 を 引数が '元の関数の最初の引数' で戻り値が '元の関数の残りの引数を取り, 結果を返す関数'」 となるように関数を作成することを指します。語弊がありますが、F#においては、タプル型の引数を取る関数を、引数を一つのみ取るような関数を結合した関数に変換すれば、カリー化していると言っても差し支えないでしょう。
F#の関数は、デフォルトでカリー化されます。つまりタプル形式の引数指定を行わない場合、F#の関数は(見た目上)引数を一つしか受け取らないような関数となっています。'見た目上'と書いたのは実際にはそうなっていないためです。関数型言語の中には言語仕様として「関数は必ず一つの引数のみを取る」という仕様をもっている言語も存在しています。そういった言語では見た目だけでなく、実際に内部的にも関数は一つの引数しか受け取っていないことになっています。
この「関数は必ず一つの引数のみを取る」という文言だけ見てしまうと、「複数の引数を持ちたい場合はタプル形式でしか引数指定ができないのか?」と思う人がいるかもしれません。ですが、ここでもう一つのキーワードである、「引数が '元の関数の最初の引数' で戻り値が '元の関数の残りの引数を取り, 結果を返す関数」に目を向けます。これはつまり、「関数を返す関数を作る = 高階関数を作る」ということです。こうすることによって、複数の引数値をタプル化せずに受け取れるわけです。
言葉だけだと難しく感じてしまいますが、実際はそうではありません。事実、F#ではカリー化を意識することなくカリー化された関数を作成できます。もしかするとすでに使っているかもしれません。以下はその簡単な例です。
サンプルでみるカリー化
いろいろ紹介や説明をする前に、まず、カリー化されているさまざまな関数をサンプルで見てみましょう。
カリー化を利用すると、ベースとなる関数の一部の引数値を固定値とした新しい関数を作成することができます。この「関数の一部の引数値をある値で固定する」ことを 部分適用 といいます。部分適用は非常に便利なテクニックなので、コーディングをしているとよく利用します。ぜひ使えるようになりましょう。