LINEスタンプ制作代行サービス・LINEスタンプの作り方!

お電話でのお問い合わせ:03-6869-8600

stampfactory大百科事典

カリー化

カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。クリストファー・ストレイチーにより論理学者ハスケル・カリーにちなんで名付けられたが、実際に考案したのはMoses Schönfinkelとゴットロープ・フレーゲである。ごく簡単な例として、f(a, b) = c という関数 f があるときに、F(a) = g(ここで、g は g(b) = c となる関数である)という関数 F が、f のカリー化である。関数 "f" が formula_1 の形のとき、formula_2 をカリー化したものを formula_3 とすると、formula_4 の形を取る。uncurryingは、これの逆の変換である。カリー化とは直感的には、「関数の複数引数を、1引数ずつ順に、バラバラにする」ということである。たとえば、除算の関数 formula_5 をカリー化したものを formula_6 とすると、formula_7 はxのみを引数に取る。そして formula_8 とすると、formula_9 はyのみを引数に取る新しい関数となり、formula_10、つまり引数の逆数を返す関数になる。言葉ではわかりにくいのでSchemeとJavaScriptで実装した例を示す。理論計算機科学の分野では、カリー化を利用すると、複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる。圏論では、カリー化の概念を冪対象の普遍性に見出せる。適当な2つの対象の積から別の対象への射 formula_11 に対して、射 formula_12 が一意に対応する。カリー化をする現実の動機の1つに、カリー化することで後述する部分適用が行いやすくなることが挙げられる。たとえば、加算を行う関数 codice_1 をカリー化してから、最初の引数だけに codice_2 を適用すれば、インクリメント用の関数が簡単に作れる。カリー化を基盤としているプログラミング言語もある。特にMLとHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。第一級関数を扱える言語、たとえばLISP、Scheme、F#、Scala、Erlang、Eiffel、Perl、Ruby、Python、R言語、S言語、JavaScript、Swiftなどでは、カリー化関数を作ることができる。カリー化は部分適用と混同されやすい。部分適用とは、複数引数ある関数の引数の一部だけに実引数を適用する操作のことで、上述のformula_13の例で言えば、formula_14からformula_9を導出する操作を指す。一方、カリー化はformula_6を導出する操作であり、引数への値の適用までは行わない。標準C++ライブラリの codice_3 は部分適用の一例である。この混同はしばしば言語設計者によってもなされる。Groovyでは、部分適用を行う標準メソッドにcurryという名前がつけられている。また、Haskellにある標準関数curryも、一般的なカリー化と厳密には違う動作をする。この関数は (a, b) -> c という型を持つ関数を a -> b -> c 型の関数に変換するが、元の関数は2要素のタプルを取る1引数関数であり、2引数関数ではない。Haskellは上述のとおり全ての関数が1引数関数であり(つまり、全ての関数が元々カリー化された形であるとも表現される)、よってHaskellプログラムの上では、厳密な意味でカリー化を行う関数は定義できない。ただし型理論上は、X、Yという型の要素を持つタプルの型は直積 formula_17 とほぼ同一視できるため、必ずしも誤用というわけではない。

出典:wikipedia

LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。