javascript - JavaScript和Haskell的函数组合

标签 javascript node.js v8

在 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/

相关文章:

javascript - 各种Javascript优化项目如何影响DOM性能?

javascript - getpid 和 getppid 函数的 emscripten 代码

javascript - 仅重新加载页面一次在 Safari 浏览器的 Windows 版本上不起作用

javascript - Litebox 插件不起作用

node.js - Postgresql 问题..DatabaseError : Connection terminated

node.js - Node.js 的 stripe api 的 token 和安全性 (stripe-node)

javascript - 我的 https 网站在 google auth 重定向到 http 后

javascript - 启用单击时滚动

JavaScript 返回对象未按预期工作

javascript - 为什么在这个 JavaScript 示例中移位比索引访问更快?