部分関数適用とは、特定の関数のいくつかの引数を修正して、引数の少ない別の関数を生成することです。
sum = lambda x, y: x + y
inc = lambda x: sum(x, 1)
「inc」は、コンテキストから何もキャプチャせずに部分的に適用された「合計」であることに注意してください(閉鎖について言及したように)。
しかし、そのような手書きの (通常は匿名の) 関数はちょっと面倒です。内部関数を返す関数ファクトリを使用できます。内部関数は、そのコンテキストからいくつかの変数をキャプチャすることでパラメーター化できます。
# sum = lambda x, y: x + y
def makePartialSumF(n):
def partialSumF(x):
return sum(x, n)
return partialSumF
inc = makePartialSumF(1)
plusTwo = makePartialSumF(2)
ここでは、ファクトリ makePartialSumF が 2 回呼び出されます。各呼び出しは、partialSumF 関数になります (さまざまな値を n としてキャプチャします)。クロージャを使用すると、部分適用の実装が便利になります。したがって、部分適用はクロージャーによって実装できると言えます。もちろん、クロージャーは他の多くのことを行うことができます! (サイド ノードとして、python には適切なクロージャがありません。)
カリー化とは、N 引数の関数を、単項関数を返す単項関数に変換することです。たとえば、3 つの引数を取り、値を返す関数があります。
sum = lambda x, y, z: x + y + z
カレーバージョンは
curriedSum = lambda x: lambda y: lambda z: x + y + z
あなたはそのような python コードを書かないに違いありません。IMO Currying の動機は、主に理論的な関心事です。(単項関数のみを使用して計算を表現するフレームワーク:すべての関数は単項です!) 実際的な副産物は、関数がカリー化されている言語では、一部の部分的な適用 (左から引数を「固定」する場合) は、引数を提供するのと同じくらい簡単です。カリー化された関数に。(しかし、すべての部分適用がそのようであるとは限りません。例: 与えられた f(x,y,z) = x+2*y+3*z で、y を定数にバインドして 2 つの変数の関数を生成する場合。)カリー化は、実際に、そして副産物として、多くの有用な部分関数型アプリケーションを些細なものにすることができる手法ですが、それはカリー化のポイントではありません。