我有限的理解是这样的:
1)部分功能应用
部分函数应用程序是返回带有较少数量参数的函数的过程。如果您提供3个参数中的2个,它将返回一个接受3-2 = 1个参数的函数。如果您提供3个参数中的1个,它将返回一个带有3-1 = 2个参数的函数。如果需要,甚至可以部分应用3个参数中的3个,它将返回不带参数的函数。
因此,给出以下功能:
f(x,y,z) = x + y + z;
当将1绑定到x并将其部分应用于上述函数时,f(x,y,z)
您将得到:
f(1,y,z) = f'(y,z);
哪里: f'(y,z) = 1 + y + z;
现在,如果将y绑定到2并将z绑定到3,然后部分应用,f'(y,z)
您将得到:
f'(2,3) = f''();
其中:f''() = 1 + 2 + 3
;
现在,在任何时候,你可以选择评估f
,f'
或f''
。所以我可以做:
print(f''()) // and it would return 6;
要么
print(f'(1,1)) // and it would return 3;
2)咖喱
另一方面,咖喱是将一个函数拆分为一个包含一个参数函数的嵌套链的过程。您永远不能提供超过1个参数,它是一或零。
因此给定相同的功能:
f(x,y,z) = x + y + z;
如果您对它进行管理,将获得3个功能链:
f'(x) -> f''(y) -> f'''(z)
哪里:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
现在,如果你打电话f'(x)
用x = 1
:
f'(1) = 1 + f''(y);
返回一个新函数:
g(y) = 1 + f''(y);
如果调用g(y)
具有y = 2
:
g(2) = 1 + 2 + f'''(z);
返回一个新函数:
h(z) = 1 + 2 + f'''(z);
最后,如果你调用h(z)
带z = 3
:
h(3) = 1 + 2 + 3;
您已返回6
。
3)关闭
最后,闭包是将功能和数据作为单个单元一起捕获的过程。函数闭包可以接受0到无限数量的参数,但是它也知道没有传递给它的数据。
同样,给定相同的功能:
f(x,y,z) = x + y + z;
您可以改写闭包:
f(x) = x + f'(y, z);
哪里:
f'(y,z) = x + y + z;
f'
已关闭x
。意思是f'
可以读取里面的x的值f
。
所以,如果你是打电话f
用x = 1
:
f(1) = 1 + f'(y, z);
您将获得关闭:
closureOfF(y, z) =
var x = 1;
f'(y, z);
现在,如果您closureOfF
使用y = 2
和致电z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
哪个会回来 6
结论
库里函数,部分应用程序和闭包在某种程度上都相似,因为它们将函数分解为更多部分。
Currying将多个参数的函数分解为单个参数的嵌套函数,这些嵌套函数返回单个参数的函数。引入一个或更少参数的函数是没有意义的,因为这没有意义。
部分应用程序将多个自变量的函数分解为较小自变量的函数,该函数现在将缺少的自变量替换为提供的值。
闭包将一个函数分解为一个函数和一个数据集,其中未传递的函数内变量可以在数据集内查找以求值以供求值时绑定。
所有这些令人困惑的是,它们可以被用来实现其他子集的一种。因此,从本质上讲,它们只是实现细节。它们都提供了相似的值,因为您不需要预先收集所有值,并且可以重用部分函数,因为您已经将其分解为谨慎的单元。
揭露
我绝不是该主题的专家,我只是最近才开始学习这些知识,因此,我提供了我目前的理解,但是可能有一些错误,请您指出,我将按/如果我发现了。