【问题标题】:Writing compose from scratch, how do parameters get passed down?从零开始写compose,参数怎么传下来?
【发布时间】:2020-11-30 20:27:49
【问题描述】:

我的任务是从头开始编写 compose,以下是要求:

编写 Compose 和 Pipe 函数。

第一步:实现函数 Compose:

Compose 应该返回一个函数,该函数是一个列表的组合 任意长度的函数。

每个函数都在后面的函数的返回值上调用。

您可以将撰写视为通过其参数从右向左移动。

编写示例:

var greet = function(name){ return 'hi: ' + name;}
var exclaim = function(statement) { return statement.toUpperCase() + '!';}
var welcome = compose(greet, exclaim);
welcome('phillip'); // 'hi: PHILLIP!'

我主要依靠直觉来完成工作,这是我的解决方案:

var compose = function() {
  var args = arguments
  return function(param) {
    var result = param
    for (let i = args.length -1; i >=0; i --) {
      result = args[i](result)
    }
    return result
  }

};

我不明白的是:“菲利普”如何传递给参数? Compose 无法访问它

【问题讨论】:

  • 我不明白这个问题。字符串直接传递给param参数。
  • @Quentin 但是,compose 不接受任何参数,那么如何从 compose 中访问 param
  • 不是。从welcome访问!

标签: javascript algorithm scope closures


【解决方案1】:
const compose = (...funcs) => params =>
  funcs.reduceRight((value, func) => func(value), params)

首先,我已经偏离了你对函数 compose 的实现。

参数params 作为reduceRight 函数的第二个参数initValue 传递,因此第一个函数调用是使用它进行的。注意第一个函数调用是funcs数组中的最后一个函数。

用法:

compose(x => x**2, x => x/2)(2); // returns 1

【讨论】:

    【解决方案2】:

    您必须将 exclaim func 的结果作为参数传递给 greet func

    const greet = (name) => 'hi: ' + name;
    const exclaim = (statement) => statement.toUpperCase() + '!';
    const compose = (f1,f2) => (name) => f1(f2(name))
    const welcome = compose(greet, exclaim);
    welcome('phillip');
    // 'hi: PHILLIP!'
    

    【讨论】:

    • 没有。该代码使用arguments,因此它可以处理可变数量的参数。
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多