JavaScript与Haskell的函数组合

JavaScript与Haskell的函数组合,javascript,node.js,v8,Javascript,Node.js,V8,在JavaScript中,我们可以定义为使用一个包含两个函数f和g的函数来生成一个新函数: function o(f, g) { return function(x) { return f(g(x)); } } function (x) { return f(g(x)); } 这似乎很明显,但我的问题是,运行时解释器/编译器是否实际计算了f(g(x)) 假设我们有一些大数据,比如一个包含许多元素的数组,并且先前通过计算合成的函数o作为f(g(x))比未压缩的f(g(x

在JavaScript中,我们可以定义为使用一个包含两个函数f和g的函数来生成一个新函数:

function o(f, g) {
  return function(x) {
   return f(g(x));
  }
 }
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 o(f, g) {
  return function(x) {
   return f(g(x));
  }
 }
function (x) {
    return f(g(x));
}
然后,仅在调用该匿名函数时,
g(x)
将执行,然后
f
将对
g(x)
的结果执行。每次调用该匿名函数时,
g
f
都会依次执行。因此,由于额外匿名函数的轻微开销,使用组合函数将比在代码中的任何地方手动调用
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)

在调用由
o
返回的组合函数之前,不会执行任何计算。这个新函数只跟踪
f
g
是什么,并在传入
x
时调用它们,计算并返回最终结果