- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试创建 curry function可以应用于任何函数并返回另一个函数,并应用其中一个参数。我想要的属性:
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),因为匿名函数将在全局词法环境。
所以问题:
最佳答案
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/
我是一名优秀的程序员,十分优秀!