カレー

数学コンピュータ サイエンスにおいて、カリー化とは、複数の引数を取る関数を、それぞれが 1 つの引数を取る一連の関数に 変換する手法です。

プロトタイプの例では、から 1 つ、 から 1 つの引数を受け取り、 内のオブジェクトを生成する関数から始めます。この関数のカリー化された形式では、最初の引数がパラメーターとして扱われ、関数のファミリーが作成されます。このファミリーは、内の各オブジェクトに対して1 つの関数が存在するように配置されます。つまり、内の任意の に対して、 となります。 f:X×はいZ{\displaystyle f:(X\times Y)\to Z}X{\displaystyle X}はい{\displaystyle Y,}Z{\displaystyle Z.}f×:はいZ{\displaystyle f_{x}:Y\to Z.}×{\displaystyle x}X{\displaystyle X,}f×{\displaystyle f_{x}}y{\displaystyle y}はい{\displaystyle Y}f×yf×y{\displaystyle f_{x}(y)=f(x,y)}

この例では、自体はを引数として受け取り、各 をにマッピングする関数を返す関数になります。これを表現する適切な表記法は冗長です。関数 は関数の集合に属します。 一方、は関数の集合に属します。したがって、 にマッピングされるものは型になります。この表記法では、は最初の集合からオブジェクトを受け取り、2番目の集合のオブジェクトを返す関数であるため、 と書きます。これはやや非公式な例です。「オブジェクト」と「関数」が何を意味するかについてのより正確な定義は以下で示します。これらの定義は文脈によって異なり、扱っている理論に応じて異なる形を取ります。 カレー{\displaystyle {\mbox{カレー}}}f{\displaystyle f}×{\displaystyle x}f×{\displaystyle f_{x}.}f{\displaystyle f}X×はいZ{\displaystyle (X\times Y)\to Z.}f×{\displaystyle f_{x}}はいZ{\displaystyle Y\to Z.}×{\displaystyle x}f×{\displaystyle f_{x}}X[はいZ]{\displaystyle X\to [Y\to Z].}カレー{\displaystyle {\mbox{カレー}}}カレー:[X×はいZ]X[はいZ]{\displaystyle {\mbox{curry}}:[(X\times Y)\to Z]\to (X\to [Y\to Z]).}

カリー化は部分適用と関連していますが、同じではありません。[ 1 ] [ 2 ]上記の例は部分適用を説明するのに使用できます。部分適用と非常に似ています。部分適用は、とを引数として受け取り、を返す関数です。上記と同じ表記法を用いると、部分適用のシグネチャは となります。このように記述すると、適用はカリー化の随伴関数であることがわかります。 適用する{\displaystyle {\mbox{適用}}}f{\displaystyle f}×{\displaystyle x}f×{\displaystyle f_{x}.}適用する:[X×はいZ]×X[はいZ]{\displaystyle {\mbox{apply}}:([(X\times Y)\to Z]\times X)\to [Y\to Z].}

2 つ以上の引数を持つ関数のカリー化は、帰納法によって定義できます。

カリー化は、実用面でも理論面でも有用である。関数型プログラミング言語をはじめとする多くの言語において、関数や例外への引数の受け渡し方を自動管理する手段を提供する。理論計算機科学においては、複数の引数を持つ関数を、1つの引数しか持たないより単純な理論モデルで研究する方法を提供する。カリー化とアンカリー化の厳密な概念の最も一般的な適用範囲は、閉モノイド圏であり、これは証明とプログラムのカリー・ハワード対応を、量子力学コボルディズム弦理論など、他の多くの構造との対応へと広範に一般化するための基盤となっている。[ 3 ]

カリー化の概念はゴットロブ・フレーゲによって導入され、[ 4 ] [ 5 ]モーゼス・シェーンフィンケルによって発展させ、[ 6 ] [ 5 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ]ハスケル・カリー によってさらに発展させられました。[ 8 ] [ 10 ] [ 12 ] [ 13 ]

アンカリー化はカリー化の双対変換であり、非関数化の一種と見ることができます。これは、戻り値が別の関数 である関数 を受け取り、と の両方の引数をパラメータとして受け取り、結果としてそれらの引数に と を適用した結果を返す新しい関数を生成します。この処理は反復可能です。 f{\displaystyle f}グラム{\displaystyle g}f{\displaystyle f'}f{\displaystyle f}グラム{\displaystyle g}f{\displaystyle f}グラム{\displaystyle g}

モチベーション

カリー化は、複数の引数を取る関数を扱い、関数が1つの引数しか取らないような枠組みでもそれらを使用する方法を提供します。例えば、一部の解析手法は1つの引数を取る関数にしか適用できません。実際の関数は、これより多くの引数を取ることがよくあります。フレーゲは、複数の引数を取る関数を1つの引数を取る関数の連鎖に変換できるため、1つの引数の場合の解決策を提供すれば十分であることを示しました。この変換は、現在カリー化として知られているプロセスです。[ 14 ]数学的解析コンピュータプログラミングで典型的に遭遇する可能性のあるすべての「通常の」関数は、カリー化できます。しかし、カリー化が不可能なカテゴリも存在します。カリー化が可能な最も一般的なカテゴリは、閉モノイドカテゴリです。

一部のプログラミング言語では、複数の引数を扱うためにほぼ常にカリー化された関数が使用されます。MLとHaskellは顕著な例で、どちらの場合もすべての関数は正確に1つの引数を持ちます。この特性はラムダ計算から継承されており、ラムダ計算では複数の引数を持つ関数は通常カリー化された形式で表現されます。

カリー化は部分適用と関連していますが、同じではありません。[ 1 ] [ 2 ]実際には、クロージャのプログラミング手法を使用して、カリー化された関数とともに移動する環境で引数を隠すことにより、部分適用と一種のカリー化を実行できます。

歴史

「カリー化」の「カリー」は、この概念を広く用いた論理学者ハスケル・カリーを指しているが、モーゼス・シェーンフィンケルはカリーより6年前にこのアイデアを思いついた。[ 10 ]別名「シェーンフィンケル化」という名称も提案されている。[ 15 ]数学の文脈では、この原理は1893年のフレーゲの研究にまで遡ることができる。[ 4 ] [ 5 ]

「カリー化」という言葉の創始者は明らかではない。デイビッド・ターナーは、この言葉はクリストファー・ストラチーが1967年の講義ノート『プログラミング言語の基本概念』の中で作ったものだと述べている[ 16 ]。しかし、この資料ではこの概念は「シェーンフィンケルが考案した手法」として紹介されており、「カリー化」という用語は使われていない。一方、カリーは後に高階関数の文脈で言及されている[ 7 ] 。ジョン・C・レイノルズは1972年の論文で「カリー化」を定義したが、この用語の創始者だとは主張していない[ 8 ]。

意味

カリー化は、まず非公式な定義から始めると理解しやすく、その後、様々な分野に合わせて変形することができます。まず、何らかの表記法を確立する必要があります。表記法は、からまでのすべての関数を表します。 がそのような関数である場合、 と書きます。は、それぞれ と の要素の順序付きペア、つまり との直積表しますここで、と は集合、型、または以下で説明する他の種類のオブジェクトである可能性があります。 Xはい{\displaystyle X\to Y}X{\displaystyle X}はい{\displaystyle Y}f{\displaystyle f}f:Xはい{\displaystyle f\colon X\to Y}X×はい{\displaystyle X\times Y}X{\displaystyle X}はい{\displaystyle Y}X{\displaystyle X}はい{\displaystyle Y}X{\displaystyle X}はい{\displaystyle Y}

関数が与えられた場合

f:X×はいZ{\displaystyle f\colon (X\times Y)\to Z}

カリー化は新しい関数を構築する

グラム:XはいZ{\displaystyle g\colon X\to (Y\to Z)}

つまり、は 型の引数を取り、 型の関数を返します。これは次のように定義されます。 グラム{\displaystyle g}X{\displaystyle X}はいZ{\displaystyle Y\to Z}

グラム×yf×y{\displaystyle g(x)(y)=f(x,y)}

型および型についても同様である。また、 ×{\displaystyle x}X{\displaystyle X}y{\displaystyle y}はい{\displaystyle Y}

カレーfグラム{\displaystyle {\text{curry}}(f)=g.}

アンカリー化は逆の変換であり、その右随伴関数、すなわち関数の観点から最も簡単に理解できる。apply.{\displaystyle \operatorname {apply} .}

集合論

集合論において、 という表記法は、集合 からへの関数の集合を表すのに用いられます。カリー化とは、からへの関数の集合と、から への関数の集合、そして からへの関数の集合との間の自然な一対一表現です。記号で表すと、 YX{\displaystyle Y^{X}}X{\displaystyle X}Y{\displaystyle Y}AB×C{\displaystyle A^{B\times C}}B×C{\displaystyle B\times C}A{\displaystyle A}(AC)B{\displaystyle (A^{C})^{B}}B{\displaystyle B}C{\displaystyle C}A{\displaystyle A}

AB×C(AC)B{\displaystyle A^{B\times C}\cong (A^{C})^{B}}

実際、この自然な一対一表現こそが、関数の集合に対する指数表記を正当化するものである。カリー化のあらゆる例と同様に、上の式は随伴関数対を記述する。つまり、任意の固定集合 に対して、関数 は関数 の左随伴となる。 C{\displaystyle C}BB×C{\displaystyle B\mapsto B\times C}AAC{\displaystyle A\mapsto A^{C}}

集合のカテゴリでは、オブジェクトは指数オブジェクトと呼ばれます。 YX{\displaystyle Y^{X}}

機能スペース

関数空間理論、例えば関数解析ホモトピー理論においては、位相空間間の連続関数が一般的に注目される。 からまでの関数全体の集合を(Hom関手)と書き、連続関数の部分集合を表すために という記法を用いる。ここで、は一対一である。Hom(X,Y){\displaystyle {\text{Hom}}(X,Y)}X{\displaystyle X}Y{\displaystyle Y}YX{\displaystyle Y^{X}}curry{\displaystyle {\text{curry}}}

curry:Hom(X×Y,Z)Hom(X,Hom(Y,Z)),{\displaystyle {\text{curry}}:{\text{Hom}}(X\times Y,Z)\to {\text{Hom}}(X,{\text{Hom}}(Y,Z)),}

一方、アンカリー化は逆写像である。からへの連続関数の集合にコンパクト開位相が与えられ、空間が局所コンパクトハウスドルフである場合、 YX{\displaystyle Y^{X}}X{\displaystyle X}Y{\displaystyle Y}Y{\displaystyle Y}

curry:ZX×Y(ZY)X{\displaystyle {\text{curry}}:Z^{X\times Y}\to (Z^{Y})^{X}}

は同相写像である。これは、、、がコンパクトに生成される場合にも成り立つが、[ 17 ]:第5章 [ 18 ]、他にも場合が存在する。[ 19 ] [ 20 ]X{\displaystyle X}Y{\displaystyle Y}YX{\displaystyle Y^{X}}

有用な帰結の一つは、関数が連続であるのは、そのカリー化形式が連続である場合に限る、ということです。もう一つの重要な結果は、この文脈では通常「評価」と呼ばれるmap の適用が連続であるということです(evalはコンピュータサイエンスでは厳密に異なる概念であることに注意してください)。つまり、

eval:YX×XY(f,x)f(x){\displaystyle {\begin{aligned}&&{\text{eval}}:Y^{X}\times X\to Y\\&&(f,x)\mapsto f(x)\end{aligned}}}

は、 がコンパクト開関数で局所コンパクトハウスドルフ関数のとき連続である。[ 21 ]これら2つの結果は、ホモトピーの連続性を確立する上で中心的な役割を果たす。つまり、が単位区間 のとき、はから への2つの関数のホモトピー、またはそれと同値な における単一の(連続)パスのいずれかとして考えることができる。 YX{\displaystyle Y^{X}}Y{\displaystyle Y}X{\displaystyle X}I{\displaystyle I}ZI×Y(ZY)I{\displaystyle Z^{I\times Y}\cong (Z^{Y})^{I}}Y{\displaystyle Y}Z{\displaystyle Z}ZY{\displaystyle Z^{Y}}

代数的位相幾何学

代数的位相幾何学において、カリー化はエックマン・ヒルトン双対性の例として用いられ、様々な状況で重要な役割を果たします。例えば、ループ空間は縮約されたサスペンションと随伴であり、これは一般的に次のように書き表されます。

[ΣX,Z][X,ΩZ]{\displaystyle [\Sigma X,Z]\approxeq [X,\Omega Z]}

ここで、は写像のホモトピー類の集合、はAサスペンション、はAループ空間である。本質的には、サスペンションは単位区間との直積とみなすことができ、区間をループに変換する同値関係を法とする。カリー化された形式は、空間をループからへの関数空間、つまりからへの関数空間に写像する。[ 21 ]そして、はサスペンションをループ空間に写像する随伴関数であり、アンカリー化はその双対である。[ 21 ][A,B]{\displaystyle [A,B]}AB{\displaystyle A\rightarrow B}ΣA{\displaystyle \Sigma A}ΩA{\displaystyle \Omega A}ΣX{\displaystyle \Sigma X}X{\displaystyle X}X{\displaystyle X}Z{\displaystyle Z}X{\displaystyle X}ΩZ{\displaystyle \Omega Z}curry{\displaystyle {\text{curry}}}

マッピングコーンとマッピングファイバー(共繊維繊維)の双対性[ 17 ]:第6章、第7章は、 カリー化の一形態として理解することができ、これは今度は、長く正確なPuppeシーケンスと共正確なPuppeシーケンスの双対性につながります。

ホモロジー代数において、カリー化とアンカリー化の関係はテンソル-ホム随伴関係として知られています。ここで興味深い展開が起こります。ホム関手テンソル積関手は、必ずしも正確な列持ち上げられるとは限りません。このことから、Ext関手Tor関手が定義されます。

ドメイン理論

順序理論、すなわち半順序集合の理論において、束にスコット位相が与えられているとき、それは連続関数である。[ 22 ]スコット連続関数は、ラムダ計算の意味論を提供しようとして最初に研究された(通常の集合論ではこれを行うには不十分であるため)。より一般的には、スコット連続関数は現在、コンピュータアルゴリズムの表示的意味論の研究を含む領域理論の分野で研究されている。スコット位相は、位相空間のカテゴリで遭遇する可能性のある多くの一般的な位相とはかなり異なることに注意されたい。スコット位相は一般に、より細かく厳密ではない。 curry{\displaystyle {\text{curry}}}

連続性の概念はホモトピー型理論に登場します。ホモトピー型理論では、大まかに言えば、2 つのコンピュータ プログラムが一方から他方へ 「連続的に」リファクタリングできる場合、それらのプログラムはホモトピックである、つまり同じ結果を計算するとみなされます。

ラムダ結石

理論計算機科学において、カリー化は、ラムダ計算のような非常に単純な理論モデルにおいて、複数の引数を持つ関数を研究する方法を提供します。ラムダ計算では、関数は単一の引数しか取りません。2つの引数を取り、型 を持つ関数を考えてみましょう。これは、 x は必ず型 を持ち、y は必ず型 を持ち、関数自体は型 を返すという意味だと理解されます。fのカリー化形式は次のように定義されます 。f(x,y){\displaystyle f(x,y)}(X×Y)Z{\displaystyle (X\times Y)\to Z}X{\displaystyle X}Y{\displaystyle Y}Z{\displaystyle Z}

curry(f)=λx.(λy.(f(x,y))){\displaystyle {\text{curry}}(f)=\lambda x.(\lambda y.(f(x,y)))}

ここではラムダ計算の抽象子である。curry は入力として という型を持つ関数を取るので、curry 自体の型は であると結論付けられる。 λ{\displaystyle \lambda }(X×Y)Z{\displaystyle (X\times Y)\to Z}

curry:((X×Y)Z)(X(YZ)){\displaystyle {\text{curry}}:((X\times Y)\to Z)\to (X\to (Y\to Z))}

→ 演算子は右結合であると考えられることが多いため、カリー化された関数型は と記述されることが多い。逆に、関数適用は左結合であると考えられるため、 はと等価である。 X(YZ){\displaystyle X\to (Y\to Z)}XYZ{\displaystyle X\to Y\to Z}f(x,y){\displaystyle f(x,y)}

((curry(f)x)y)=curry(f)xy{\displaystyle (({\text{curry}}(f)\;x)\;y)={\text{curry}}(f)\;x\;y}

つまり、適用順序を明確にするために括弧は必要ありません。

カリー化関数は、クロージャをサポートする任意のプログラミング言語で使用できます。ただし、ほとんどの関数呼び出しで部分的な適用とクロージャ作成のオーバーヘッドを回避できるため、効率上の理由から、カリー化されていない関数が一般的に好まれます。

型理論

型理論では、コンピュータサイエンスにおける型システムの一般的な考え方が、特定の型の代数として形式化されます。例えば、 と書く場合、意図されるのはと が型 であることであり、矢印は型構築子、具体的には関数型または矢印型です。同様に、型の直積は積型構築子によって構築されます。 f:XY{\displaystyle f\colon X\to Y}X{\displaystyle X}Y{\displaystyle Y}{\displaystyle \to }X×Y{\displaystyle X\times Y}×{\displaystyle \times }

型理論的アプローチは、MLや、 ML から派生またはインスピレーションを得た言語 ( CamlHaskellF# )などのプログラミング言語で表現されています。

型理論的アプローチは、後述するように、圏論の言語を自然に補完するものである。これは、圏論、特にモノイド圏が内部言語を持ち、単純型ラムダ計算がそのような言語の最も顕著な例であるためである。これは、単一の型構築子である矢印型から構築できるため、この文脈において重要である。そして、カリー化は言語に自然積型を与える。圏論と型におけるオブジェクト間の対応関係は、プログラミング言語を論理(カリー・ハワード対応を介して)として、あるいは以下でさらに詳しく検討するように他の種類の数学体系として再解釈することを可能にする。

論理

カリー・ハワード対応によれば、タプル積型)が論理の論理積に対応し、関数型が含意に対応するため、カリー化とアンカリー化の存在は論理定理(エクスポートとも呼ばれる)と同等です。 ((AB)C)(A(BC)){\displaystyle ((A\land B)\to C)\Leftrightarrow (A\to (B\to C))}

ハイティング代数の圏における指数的対象 は通常、物質含意と表記される。分配ハイティング代数はブール代数であり、指数的対象は明示的な という形をとるため、指数的対象が実際には物質含意 であることが明確になる。[ 23 ]QP{\displaystyle Q^{P}}PQ{\displaystyle P\to Q}¬PQ{\displaystyle \neg P\lor Q}

カテゴリー理論

上記のカリー化とアンカリー化の概念は、圏論において最も一般的かつ抽象的な表現を見出します。カリー化は指数関数的オブジェクトの普遍的性質であり、デカルト閉圏における付帯関係を生じます。つまり、二項積からのと指数関数的オブジェクトへの射の間には自然な同型性があります。 f:(X×Y)Z{\displaystyle f\colon (X\times Y)\to Z}g:XZY{\displaystyle g\colon X\to Z^{Y}}

これは、閉じたモノイドカテゴリにおけるより広い結果に一般化されます。カリー化とは、テンソル積内部 Homが随伴関数であるというステートメントです。つまり、すべてのオブジェクトには自然な同型性があります。 B{\displaystyle B}

Hom(AB,C)Hom(A,BC).{\displaystyle \mathrm {Hom} (A\otimes B,C)\cong \mathrm {Hom} (A,B\Rightarrow C).}

ここで、Hom は圏 内のすべての射の(外部)Hom 関手を表し、 は閉モノイド圏 の内部 hom 関手を表します。集合 の圏では、これら2つは同じです。積が直積である場合、内部 hom は指数対象 になります。 BC{\displaystyle B\Rightarrow C}BC{\displaystyle B\Rightarrow C}CB{\displaystyle C^{B}}

カリー化は2つの場合のいずれかで破綻します。1つは、圏が閉じていない場合、つまり内部ホム関数を持たない場合です(そのような関数の選択肢が複数ある場合など)。もう1つは、圏がモノイド的でない場合、つまり積を持たない場合です(つまり、オブジェクトのペアを記述する方法がありません)。積と内部ホムの両方を持つ圏は、まさに閉モノイド圏です。

カルティシアン閉圏の設定は古典論理の議論には十分であるが、より一般的なモノイド閉圏の設定は量子計算に適している。[ 24 ]

これら2つの違いは、直積圏(集合圏完全半順序圏、ハイティング代数など)の積は直積そのものであり、順序付けられたアイテムのペア(またはリスト)として解釈されるという点です。単純型付きラムダ計算は、直積閉圏の内部言語です。そのため、ペアとリストは、LISPScheme、そして多くの関数型プログラミング言語型理論において主要なとなっています。

対照的に、モノイド的カテゴリ(ヒルベルト空間関数解析ベクトル空間など)の積はテンソル積である。このようなカテゴリの内部言語は線型論理であり、これは量子論理の一種である。対応する型システムは線型システムである。このようなカテゴリは量子もつれ状態を記述するのに適しており、より一般的には、カリー・ハワード対応量子力学代数的位相幾何学におけるコボルディズム弦理論へと大幅に一般化することができる。[ 3 ]線型システム線型論理は、相互排他ロックや自動販売機の動作などの 同期プリミティブを記述するのに有用である。

部分関数適用との対比

カリー化と部分関数適用はしばしば混同される。[ 1 ] [ 2 ]両者の大きな違いの一つは、部分適用された関数の呼び出しは、カリー化チェーンの別の関数ではなく、すぐに結果を返すことである。この違いは、アリティが2より大きい関数の場合に明確に示せる。 [ 25 ]

型 の関数をカリー化すると が生成されます。つまり、最初の関数の評価は と表現できますが、カリー化された関数の評価は と表現され、各引数を、前の呼び出しで返された単一引数の関数に順番に適用します。 を呼び出した後、2つの引数を取る関数ではなく、単一の引数を取り、別の関数を返す関数が残ることに注意してください。 f:(X×Y×Z)N{\displaystyle f\colon (X\times Y\times Z)\to N}curry(f):X(Y(ZN)){\displaystyle {\text{curry}}(f)\colon X\to (Y\to (Z\to N))}f(1,2,3){\displaystyle f(1,2,3)}fcurried(1)(2)(3){\displaystyle f_{\text{curried}}(1)(2)(3)}fcurried(1){\displaystyle f_{\text{curried}}(1)}

対照的に、部分関数適用とは、関数の引数の数を固定し、引数の数が少ない別の関数を生成するプロセスを指します。上記の の定義から、最初の引数を固定(または「束縛」)して、 型の関数を生成することができます。この関数の評価は と表すことができます。この場合、部分関数適用の結果は2つの引数を取る関数であることに注意してください。 f{\displaystyle f}partial(f):(Y×Z)N{\displaystyle {\text{partial}}(f)\colon (Y\times Z)\to N}fpartial(2,3){\displaystyle f_{\text{partial}}(2,3)}

直感的に言えば、部分関数適用とは「関数の最初の引数を固定すると、残りの引数の関数が得られる」ということです。例えば、関数div が除算x / yを表すとすると、引数x を1 に固定したdiv(つまりdiv 1)は別の関数になります。これは、引数の逆数を返す関数invと同じで、 inv ( y ) = 1/ yで定義されます。

部分適用の実際的な動機は、関数に引数のすべてではなく一部を与えることで得られる関数が有用であることが非常に多いことです。例えば、多くの言語には に似た関数や演算子がありますplus_one。部分適用により、例えば最初の引数として1を境界とする加算演算子を表す関数を作成することで、これらの関数を簡単に定義できます。

部分適用は、カリー化された関数を固定ポイントで評価することと見なすことができます。たとえば、指定された後、または単にf の最初のパラメーターをカリー化します。 f:(X×Y×Z)N{\displaystyle f\colon (X\times Y\times Z)\to N}aX{\displaystyle a\in X}curry(partial(f)a)(y)(z)=curry(f)(a)(y)(z){\displaystyle {\text{curry}}({\text{partial}}(f)_{a})(y)(z)={\text{curry}}(f)(a)(y)(z)}partial(f)a=curry1(f)(a){\displaystyle {\text{partial}}(f)_{a}={\text{curry}}_{1}(f)(a)}curry1{\displaystyle {\text{curry}}_{1}}

したがって、部分適用は固定点におけるカリー化された関数に簡約されます。さらに、固定点におけるカリー化された関数は(自明に)部分適用です。さらなる証拠として、任意の関数 が与えられた場合、 となるような関数を定義できることに注目してください。したがって、任意の部分適用は単一のカリー化演算に簡約できます。したがって、カリー化は、多くの理論的ケースにおいて再帰的に適用されることが多いものの、理論的には(演算として考えた場合)部分適用と区別できない演算として定義する方が適切です。 f(x,y){\displaystyle f(x,y)}g(y,x){\displaystyle g(y,x)}g(y,x)=f(x,y){\displaystyle g(y,x)=f(x,y)}

したがって、部分適用は、ある関数の入力の特定の順序に対してカリー演算子を 1 回適用した客観的な結果として定義できます。

参照

参考文献

  1. ^ a b c cdiggins (2007年5月24日). 「カリー化 != 一般化部分適用?!」 Lambda the Ultimate: The Programming Languages Weblog .
  2. ^ a b c「部分関数適用はカリー化ではない」。The Uncarved Block。2020年8月7日。2016年10月23日時点のオリジナルよりアーカイブ。
  3. ^ a b Baez, John C.; Stay, Mike (2009年6月6日). 「物理学、トポロジー、論理、そして計算:ロゼッタストーン」. Coecke, Bob (編). New Structures for Physics (PDF) . Lecture Notes in Physics. Vol. 813: New Structures for Physics. ベルリン、ハイデルベルク:Springer (2010年7月5日発行). pp.  95– 172. arXiv : 0903.0340 . doi : 10.1007/978-3-642-12821-9_2 . ISBN 978-3-642-12821-9. S2CID  115169297 . 2022年12月5日時点のオリジナル(PDF)からアーカイブ。
  4. ^ a bフレーゲ、ゴットロブ(1893)。「§36」Grundgesetze der arithmetik (ドイツ語)。ウィスコンシン大学マディソン校のコレクションからの書籍。2008 年 8 月 26 日に Google によってデジタル化されました。イエナ: ヘルマン ポール。54~ 55ページ 
  5. ^ a b c Quine, WV (1967). 「モーゼス・シェーンフィンケルの1924年の著書『数理論理学の構成要素について』への序論」ジャン・ヴァン・ヘイエノールト編著『フレーゲからゲーデルへ:1879年から1931年までの数学論理学の原典』ハーバード大学出版局、  355~ 357頁。ISBN 9780674324497
  6. ^モーセのシェーンフィンケル(1924 年 9 月) [1920 年 12 月 7 日にゲッティンゲンの Mathematischen Gesellschaft (数学協会) で発表。1924 年 3 月 15 日に Mathematische Annalen によって受け取られた]。"Über die Bausteine der mathematischen Logik" [数学的論理の構成要素について] (PDF)数学アンナレン923-4)。ベルリン: Springer: 305–316 . doi : 10.1007/BF01448013S2CID 118507515 
  7. ^ a b Strachey, Christopher (2000年4月) [この論文は、1967年8月にコペンハーゲンで開催された国際コンピュータプログラミングサマースクールで行われた講義の内容をまとめたものです。] 「プログラミング言語の基本概念」 . Higher-Order and Symbolic Computation . 13 : 11– 49. CiteSeerX 10.1.1.332.3161 . doi : 10.1023/A:1010000313106 . ISSN 1573-0557 . S2CID 14124601 . Schönfinkel によって考案された、複数のオペランドを持つ演算子を、単一のオペランドを持つ演算子の連続的な適用に簡略化する手法があります。   
  8. ^ a b c初版はReynolds, John C. (1972年8月1日). "Definitional interpreters for high-order programming languages" . Shields, Rosemary (ed.). Proceedings of the ACM annual conference - ACM '72 . Vol. 2. ACM Press. pp.  717– 740. doi : 10.1145/800194.805852 . ISBN 9781450374927. S2CID  163294 .最後の行では、論理学者H.カリーにちなんで「カリー化」と呼ばれるトリックを使用して、すべての関数が単一の引数を受け入れる言語に二項演算を導入するという問題を解決しました。(査読者は、「カリー化」の方が味わい深いが、「シェーンフィンケリング」の方が正確かもしれないとコメントしています。)Reynolds, John C. (1998). "Definitional Interpreters for Higher-Order Programming Languages" . Higher-Order and Symbolic Computation . 11 (4). Boston: Kluwer Academic Publishers: 363–397 . doi : 10.1023/A:1010027404223 . 13 – シラキュース大学工学部・コンピュータサイエンス学科 - 旧学科・センター・研究所・プロジェクトより転載。
  9. ^スロンネガー、ケネス、クルツ、バリー・L. (1995). 「カリー化関数 5.1: 概念と例、第5章 ラムダ計算」.プログラミング言語の形式構文と意味論:実験室ベースのアプローチ(PDF) . アディソン・ウェズリー出版社. 144ページ. ISBN 0-201-65697-3
  10. ^ a b c Curry, Haskell B. (1980). Barwise, Jon; Keisler, H. Jerome; Kunen, Kenneth (編). 「組合せ論理の哲学的側面」.クリーネ・シンポジウム:1978年6月18日から24日まで米国ウィスコンシン州マディソンで開催されたシンポジウムの議事録 (論理学と数学の基礎研究) . 『論理学と数学の基礎研究』. 101. North-Holland Publishing Company, Elsevierの印刷物: 85– 101. doi : 10.1016/S0049-237X(08)71254-0 . ISBN 9780444853455. ISSN  0049-237X . S2CID  117179133 .現代の論理学者の中には、関数のこの見方を「カリー化」と呼ぶ人もいます。なぜなら、私はこの方法を多用したからです。しかし、シェーンフィンケルは私より6年ほど前にこのアイデアを思いつきました。
  11. ^ "Currying Schonfinkelling" . Portland Pattern Repository Wiki . Cunningham & Cunningham, Inc. 2012年5月6日.
  12. ^バレンドレット、ヘンク;エリック・バレンセン (2000 年 3 月) [1998 年 12 月]。ラムダ微積分入門(PDF) (改訂版)。 p. 8.
  13. ^ Curry, Haskell ; Feys, Robert (1958).組合せ論理第1巻 (第2版). アムステルダム, オランダ: North-Holland Publishing Company.
  14. ^ Hutton, Graham; Jones, Mark P. 編 (2002年11月). comp.lang.functional のよくある質問、3. 技術的なトピック、3.2. カリー化」ノッティンガム大学コンピュータサイエンス学部.
  15. ^ハイム、アイリーン、クラッツァー、アンジェリカ(1998年1月2日)『生成文法の意味論』(PDF)マサチューセッツ州モールデン:ブラックウェル・パブリッシャーズ(ワイリー傘下)。ISBN 0-631-19712-5
  16. ^ Turner, David (1997年6月1日). 「プログラミング言語、カリー化か、それともシェーンフィンケリングか? #9/14」 .コンピュータプログラミング言語フォーラム. 2022年3月3日時点のオリジナルよりアーカイブ。 2022年3月3日閲覧
  17. ^ a bジョン・ピーター・メイ (1999).代数的位相幾何学の簡潔な講義(PDF) . シカゴ数学講義. イリノイ州シカゴ: シカゴ大学出版局. pp.  39– 55. ISBN 0-226-51183-9. OCLC  41266205 .
  18. ^ 「コンパクトに生成された位相空間」 nLab . 2023年5月28日.
  19. ^ Tillotson, J.; Booth, Peter I. (1980年3月) [1978年10月2日受理、1979年6月29日改訂、1980年5月1日発行]. ニューファンドランド・メモリアル大学にて執筆。「モノイド閉空間、カルティシアン閉空間、および位相空間の便利なカテゴリー」(PDF) . Pacific Journal of Mathematics . 88 (1). カリフォルニア州バークレー: Mathematical Sciences Publishers: 35– 53. doi : 10.2140/pjm.1980.88.35 . eISSN 1945-5844 . ISSN 0030-8730 .  
  20. ^ 「位相空間の便利なカテゴリー」nLab . 2023年8月11日.
  21. ^ a b cロットマン、ジョセフ・ジョナ (1988). 「第11章代数的位相幾何学入門」 . 大学院数学テキスト; 119. ニューヨーク: シュプリンガー・フェアラーク. ISBN 978-0-387-96678-6. OCLC  17383909 .
  22. ^ Barendregt, Hendrik Pieter (1984). 「定理1.2.13, 1.2.14」.ラムダ計算:その構文と意味論. 論理学と数学の基礎研究. 第103巻(改訂版). North-Holland, Elsevierの印刷物. ISBN 978-0-444-87508-2
  23. ^ Mac Lane, Saunders; Moerdijk, Ieke (1992). 「第1章 関手の圏; 第7節 命題計算、第8節 ハイティング代数、第9節 随伴項としての数量詞」 . Sheaves in Geometry and Logic: A First Introduction to Topos Theory . New York: Springer-Verlag, part of Springer Science & Business Media. pp.  48– 57. ISBN 978-0-387-97710-2
  24. ^ Abramsky, Samson; Coecke, Bob (2007年3月5日). 「量子プロトコルのカテゴリカルセマンティクス」. Logic in Computer Science (LICS 2004): Proceedings, 19th Annual IEEE Symposium, Turku, Finland, 2004. IEEE Computer Society Press. pp.  415– 425. arXiv : quant-ph/0402130 . doi : 10.1109/LICS.2004.1319636 . ISBN 978-0-7695-2192-3
  25. ^ Lee, G. Kay (2013年5月15日). 「5分でわかる関数型プログラミング」 .スライド.