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

削除された内容 追加された内容
記事内の記述でカリー化と部分適用を混同している箇所を修正
6行目:
関数 ''f'' が <math>f:(X \times Y) \to Z</math> の形のとき、<math>f</math> をカリー化したものを ''g'' とすると、''g'' は <math>f:X \to (Y \to Z)</math> の形を取る。'''非カリー化''' (uncurrying) とは、これの逆の変換である。
 
カリー化とは直感的には関数の複数引数を幾つか固定すると残った1引数の関数が得られずつ順に、バラバラにする」ということである。たとえば、除算の関数 <math>{\rm div}(x, y) = \frac{x}{y}</math> をカリー化したものを <math>{\rm cdiv}</math> とすると<math>{\rm cdiv} </math> はxのみを引数に取る。そして <math>{\rm inv}={\rm cdiv}(1)</math> とすると、<math>{\rm inv}</math> はyのみを引数に取る新しい関数となり、<math>{\rm inv}(y) = \frac{1}{y}</math>、つまり引数の逆数を返す関数になる。
 
[[理論計算機科学]]の分野では、カリー化を利用すると、複数の引数をとる関数を、一つの引数のみを取る複数の関数の[[ラムダ計算]]などの単純な理論的モデルと見なして研究できるようになる。[[圏論]]では、カリー化の概念を[[デカルト閉圏]]における[[冪対象]]の[[普遍性]]に見出せる。適当な2つの[[対象 (圏論)|対象]]の[[積 (圏論)|積]]から別の対象への[[射 (圏論)|射]] <math>f: X \times Y \to Z</math> に対して、射 <math>g: X \to Z^Y</math> が一意に対応する。
 
カリー化をする現実の動機の1つに関数に引数を一カリー化することで後述する[[だけ渡して新た分適用]]が行いやすく関数を作こと便利な場合がとてもよくあるか挙げである。たとえば、二つの引加算を行う関を取る <code>(+)</code> 関数のをカリー化し、最初の引数だけに <code>1</code> にしてカリー化行え適用すれば、インクリメント用の関数が簡単に作れる。
 
カリー化を基盤としている[[プログラミング言語]]もある。特に[[ML (プログラミング言語)|ML]]と[[Haskell]]では関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の[[糖衣構文]]にすぎない。[[第一級関数]]を扱える言語、たとえば[[LISP]]、[[Scheme]]、[[Scala]]、[[Erlang]]、[[Eiffel]]、[[Perl]]、[[Ruby]]、[[Python]]、[[R言語]]、[[S言語]]、[[JavaScript]]などでは、カリー化関数を作ることができる。