gpt4 book ai didi

javascript 柯里化(Currying)

转载 作者:数据小太阳 更新时间:2023-10-29 04:09:31 26 4
gpt4 key购买 nike

我正在尝试创建 curry function可以应用于任何函数并返回另一个函数,并应用其中一个参数。我想要的属性:

  1. 如果函数只有一个参数,curry 函数应该返回值:F A); curry (f,x) = f(x);
  2. 如果函数有很多参数 currey 应该重新运行 curried 函数:g(a1,a2,..,aN); curry (g,x) = g2(a2,..,aN) : g2(a2,..aN)=g(x,a2,...,aN)
  3. 柯里化(Currying)函数的长度属性应该“按需”工作g.length = N => curry(g,x).length = N-1

Prototype Framework 中有一些 curry 的实现,并在 one blog 中进行了讨论。 .但是这个实现并不好,因为它不能很好地处理只有一个参数 (1) 的函数,并且返回函数的“长度”属性为 0 (3)。

对于第一个属性,有一个简单的实现:

 function curry(f,x) {
if (f.length == 1) return f(x);
...
}

但我不知道如何使用第三条规则,即函数可以构造为内部函数,因为会有一个嵌套的 Lexical Environment 并且能够使用 f:

function curry(f,x) {
return function() { ... }
}

但在这种情况下,我将不再能够显式设置参数。另一方面,可以使用“new Function”语句构造函数,就像这样:

 function curry(f,x) {
var args = [];
for (var i=1; i<f.length; i++) {
args.push('a'+i);
}
var sa = args.join();
return new Function(sa,"return f(x,"+sa+")");
}

但在这种情况下 f 和 x 将解除绑定(bind),因为匿名函数将在全局词法环境。

所以问题:

  1. 有没有办法在使用 function 关键字创建函数时显式设置参数计数?
  2. 有没有办法设置使用“new Function”语句创建的函数的环境?
  3. 我们有办法以任何其他方式解决我的问题吗?

最佳答案

Functional 的方式库实现它是将传递给“curry()”的参数作为要传递的第一个参数。 “curry”操作的函数结果将采用调用时传入的任何附加参数,并将它们添加到参数列表的末尾。它根本不担心参数列表的长度,因为这在 JavaScript 中通常不是固定的,所以真的没有意义。

因此:

var curry = myFunction.curry("Tuesday", x + y);

这样调用:

curry(100, true);

就像打电话一样:

myFunction("Tuesday", x + y, 100, true);

Functional 有另一个名为“partial()”的函数,它允许更可控地替换参数。当您调用“partial()”时,您传入一个伪参数(“_”)以指示“空洞”在参数列表中的位置:

var partialFunc = myFunction.partial("Tuesday", _, 100, true, _, "banana");

这两个“_”参数意味着生成的“partialFunc”应该将传递给它的前两个参数放入参数列表中的那些槽中:

partialFunc(x + y, "Texas");

因此就像调用:

myFunction("Tuesday", x + y, 100, true, "Texas", "banana");

我衷心建议获取该库并查看相关代码。它出奇地简洁明了。

还有一件事:需要注意的是,因为 JavaScript 不是惰性求值语言,所以这真的与 Haskell 等惰性函数式语言中的“curry”操作不同。区别在于“curry time”的参数被求值,因此有点“煮熟”到结果中。在惰性语言中,情况有所不同。

关于javascript 柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com