カリー化って何すか?

2012-01-31

カリー化って何すか?

駄目なSEが集まって、haskellを勉強することで、ほんの少しだけ上を目指そうということになりました。 毎週集まって輪講しているのですが、さっそくカリー化で????ってなったので、しばらく調べてみた。   ちなみに教科書はこれ↓ 厚さ1.5センチくらいで手頃な感じ。ダメSEな私でもイケそうな雰囲気の本です。   さて、カリー化。  

(1) カリーとは

Wikipediaによると、関数型言語の元となった組み合わせ理論を考え出したハスケル・カリーさんに因んで名づけられたものらしい。 英語では、カリー化はcurryingらしい、そのままだ。  

(2) カリー化とは

最初のうちは、よく分からなかったのだけど、結局のところ複数の引数を持つ関数において、引数の一部のみを指定することで新しい関数を作ることが可能であるということのようです。   関数fが引数a, b, cの3つを取る場合、引数a, bのみを指定(関数の部分適用という)することで、引数a, bは決まってて、引数cを受け取って、引数a, bを適用した結果を返すような関数を作れるような関数。(書いてて意味不明になってきたが・・・)   実例が一番良さそうなので実例

1
2
kansu a b c = a * b + c
kansu' = kansu 4 5

  実例の上側は、a, b, cという3つの引数を受け取って、a * b + cを計算する関数です。 実例の下側は、kansuの引数のうち、a = 4, b = 5が決まっていて、cだけが決まってない関数です。 つまり、複数引数を持つ関数の一部の引数に値を設定し、残りの引数のみを受け取る関数を作り出したのです。   間違った表現かも知れませんが、デフォルト値を設定しているような感じでしょうか。 haskellでは、複数引数を持つ関数は、全て上記のように一部の引数のみ部分適用することが可能です。 複数引数を持つ関数は、全てカリー化することが可能なのです。   ちなみに上記例の関数を実行すると、以下のようになります。

1
2
3
4
Main> kansu 2 3 4
10
Main> kansu' 4
24

というわけで、ようやくカリー化が分かったような気がします。