【问题标题】:How to understand composition of functions with multiple arguments?如何理解具有多个参数的函数的组合?
【发布时间】:2015-02-04 04:57:32
【问题描述】:

如:

var foo = function (a, b) { return a + b; };
var bar = function (a, b) { return a * b; };

var fn = _.compose([foo, bar]);

如何理解fn

【问题讨论】:

  • 我认为你不能这样组合这两个函数。

标签: javascript functional-programming underscore.js lodash


【解决方案1】:

这行不通。

首先,_.compose() 不需要数组。它将函数列表作为单独的参数,如下所示:

var fn = _.compose(foo, bar);

然后,即使以这种方式完成,使用下划线的_.compose(),每个后续函数都会传递前一个函数的返回结果。由于您的两个函数都需要两个参数并返回一个,因此这不起作用。

如果您修复代码以将参数正确传递给_.compose(),那么您将拥有:

var foo = function (a, b) { return a + b; };
var bar = function (a, b) { return a * b; };

var fn = _.compose(foo, bar);

如果你然后像这样使用fn

fn(2, 5);

它将尝试执行:

foo(bar(2, 5));

分开来看,bar(2, 5) 将返回10,因此您将得到调用foo(10) 的结果,但这会生成NaN,因为foo() 的第二个参数是undefined

_.compose 专为列表中最后一个函数之外的函数设计,这些函数对单个参数进行操作,该参数是列表中前一个函数的返回值。

实际实现显示它返回NaN:http://jsfiddle.net/jfriend00/xhbcdh9k/

【讨论】:

【解决方案2】:

compose 函数接受多个函数并返回一个函数。所以你可以这样称呼它:var fn = compose(foo, bar);

您可以认为fn 只不过是调用bar 然后foo 的结果。例如bar(foo());

您的函数不会组合,因为 foo 需要 2 个参数 foo(a, b),但 bar 返回 1 个值。

I wrote about compose, maybe it can help you understand it better.

【讨论】:

    【解决方案3】:

    【无耻的自吹自擂】

    我写了一个小辅助函数,它的行为类似于 compose,但也传递了其余参数:

    const compound = (...fns) => (...args) =>
      fns
        .reverse()
        .reduce((result, fn) => fn(...[result, ...args.slice(1)]), args[0])
    

    https://github.com/pdme/compound

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多