gpt4 book ai didi

javascript - JavaScript 和 Haskell 的函数组合

转载 作者:行者123 更新时间:2023-11-29 22:11:57 25 4
gpt4 key购买 nike

在 JavaScript 中我们可以定义 function composition就像使用带有两个函数 f 和 g 的函数来生成一个新函数:

function o(f, g) {
return function(x) {
return f(g(x));
}
}

这似乎很明显,但我的问题是,运行时解释器/编译器是否实际计算 f(g(x))?

假设我们有一些大数据,比如一个有很多元素的数组,并且之前的组合函数 o 作为 f(g(x)) 通过先前的计算比未组合的 f 更快(g(x))

也许,在这种情况下,o(f, g) 仅仅是 f(g(x)) 的一个宏表达式?

如果它是一个宏,也许性能不会有太大差异?

这可能取决于运行时环境,我对 Chrome/node.js 的 V8 引擎特别感兴趣。

Haskell 作为惰性求值策略的语言,理论上可以组合函数,我说的对吗? GHC 是否真的计算组合函数?

最佳答案

不,函数调用 o(f, g) 将返回匿名函数:

function (x) {
return f(g(x));
}

然后,只有在调用那个匿名函数时,g(x) 才会执行,然后 f 才会对 g 的结果执行(x)。每次调用该匿名函数时,gf 都会一个接一个地执行。因此,由于额外匿名函数的轻微开销,使用组合函数将比在代码中的任何地方手动调用 f(g(x)) 慢一点。

例子:

function o(f, g){
return function(x) {
return f(g(x));
}
}

function addTo5(x){
return x + 5;
}

function multiplyBy(x){
return function(y){
return x*y;
}
}

var composed = o(multiplyBy, addTo5);
composed(5)(3); // Slightly slower than multiplyBy(addTo5(5))(3)

jsperf

关于javascript - JavaScript 和 Haskell 的函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17707753/

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