[[関数型言語]]

Currying

複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」に変換すること

具体的には、2つの引数を取って加算する関数があったとして、1つ目の引数を与えると、1引数を取って加算した結果を最初に与えた引数に加えて返す「関数」が返ります。

20世紀の数学者Haskell Curryの名前から。

2引数の関数f(x, y)に対して、「gがfのカリー化」だとは、f(x, y) = g(x)(y) が常に成立すること

#geshi(javascript){{
function sum(x, y) {
 return x + y;
}
}}
これをカリー化
#geshi(javascript){{
function curried_sum(x) {
 return function (y) {return sum(x, y);}
}
}}

とすると



#geshi(javascript){{
js> var x = curried_sum(10)
js> x(15)
25
js> curried_sum(10)(15)
25
js> curried_sum(13)(-20)
-7
js> var f = sum; var g = curried_sum
js> f(123, 999) == g(123)(999)
true
js> 
}}
となる。

*メモ [#w1612b0f]
-最近は「[[関数]]が第一級のオブジェクト」、要は「手続きの固まり」を文字列や数字のようにモノ扱いできる、[[Ruby]]や[[JavaScript]]のような言語が普及しているが、そういう言語では「カリー化」の手法が使える。


*関連 [#d01059eb]
-[[引数束縛]]
-[[ラムダ計算]]
-[[クロージャ]]

*参考 [#c89bb4f1]
-http://d.hatena.ne.jp/m-hiyama/20051213/1134446855
-http://codezine.jp/article/detail/5251?p=2
-http://blog.udzura.jp/2010/01/14/my-own-thought-about-currying/