「カリー化」の版間の差分

削除された内容 追加された内容
編集の要約なし
編集の要約なし
1行目:
'''カリー化'''(''currying'')とは、[[計算機科学]]分野の技法の一つ。複数の[[引数]]をとる[[関数 (プログラミング)|関数]]を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。この技法は、Christopher Stracheyにより論理学者[[ハスケル・カリー]]に因んで名付けられたが、実際に考案したのはMoses Schönfinkelと[[ゴットロープ・フレーゲ]]である。
 
関数 ''<math>f''</math>''<math>f'':(''X''& \times;'' Y'')→'' \to Z''</math> の形のとき、''<math>f''</math> をカリー化したものを ''<math>g''</math> とすると、''<math>g''</math>''<math>f'':''X''→ \to (''Y''→'' \to Z'')</math> の形を取る。'''非カリー化'''(''<math>uncurrying''</math>)とは、これの逆の変換である。
 
カリー化とは直感的には「引数を幾つか固定すると、残った引数の関数が得られる」ということである。たとえば、除算の関数 ''<math>{\rm div''}(''x'',\ ''y'') = ''\frac{x'' }{y}</ ''y''math> をカリー化したものを'' <math>{\rm cdiv''}</math> とし、''<math>{\rm inv''}=''{\rm cdiv''}(1)</math> とすると、''<math>{\rm inv''}</math> は新しい関数となり、''<math>{\rm inv''}(''y'') = \frac{1 }{y}</ ''y''math> 、つまり引数の逆数を返す関数になる。
 
[[理論計算機科学]]の分野では、カリー化を利用すると、複数の引数をとる関数を、一つの引数のみを取る複数の関数の[[ラムダ計算]]などの単純な理論的モデルと見なして研究できるようになる。[[圏論]]では、カリー化の概念を[[冪対象]]の[[普遍性]]に見出せる。適当な2つの[[対象 (圏論)|対象]]の[[積 (圏論)|積]]から別の対象への[[射 (圏論)|射]] ''<math>f'': ''X'' &\times; ''Y'' \to ''Z''</math> に対して、射 ''<math>g'': ''X'' \to ''Z'' <sup>''^Y''</supmath> が一意に対応する。
 
カリー化をする現実の動機は、関数に引数を一部だけ渡して新たな関数を作るのが便利な場合がとてもよくあるからである。たとえば、二つの引数を取る<code>+</code>関数の最初の引数を<code>1</code>にしてカリー化を行えば、インクリメント用の関数が簡単に作れる。