カリー化
出典: フリー百科事典『ウィキペディア(Wikipedia)』
カリー化(currying)とは、計算機科学分野の技法の一つ。複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。この技法は、Christopher Stracheyにより論理学者ハスケル・カリーに因んで名付けられたが、実際に考案したのはMoses Schönfinkelとゴットロープ・フレーゲである。
関数 f が f:(X×Y)→Z の形のとき、f をカリー化したものを g とすると、g は f:X→(Y→Z) の形を取る。非カリー化(uncurrying)とは、これの逆の変換である。
カリー化とは直感的には「引数を幾つか固定すると、残った引数の関数が得られる」ということである。たとえば、除算の関数 div(x, y) = x / y をカリー化したものをcdivとし、inv=cdiv(1) とすると、inv は新しい関数となり、inv(y) = 1 / y 、つまり引数の逆数を返す関数になる。
理論計算機科学の分野では、カリー化を利用すると、複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる。圏論では、カリー化の概念を冪対象の普遍性に見出せる。適当な2つの対象の積から別の対象への射 f: X × Y → Z に対して、射 g: X → Z Y が一意に対応する。
カリー化をする現実の動機は、関数に引数を一部だけ渡して新たな関数を作るのが便利な場合がとてもよくあるからである。たとえば、二つの引数を取る+
関数の最初の引数を1
にしてカリー化を行えば、インクリメント用の関数が簡単に作れる。
カリー化を基盤としているプログラミング言語もある。特にMLとHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。関数をfirst-class objectとして扱える言語、たとえばLISP、Scheme、Eiffel、Perl、Ruby、Python、R言語、S言語、JavaScriptなどでは、カリー化関数を作ることができる。