代码之家  ›  专栏  ›  技术社区  ›  J. Hesters

拉姆达:对管道感到困惑吗

  •  0
  • J. Hesters  · 技术社区  · 7 年前

    我试图创建一个函数,它接受参数并返回一个列表。代码如下:

    const list = R.unapply(R.identity);
    
    list(1, 2, 3); // => [1, 2, 3]
    

    现在我试着用 pipe

    const otherList = R.pipe(R.identity, R.unapply);
    
    otherList(1,2,3);
    // => function(){return t(Array.prototype.slice.call(arguments,0))}
    

    const otherList = R.pipe(R.identity, R.unapply);
    
    otherList(R.identity)(1,2,3); // => [1, 2, 3]
    

    因为某种原因而起作用。

    我知道这可能是一个新手问题,但是你会如何构造f(g(x))呢 管 ,如果f是 unapply g是 identity ?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Ori Drori    7 年前

    阅读 R.unapply docs

    所以在第一种情况下,它转换为 R.identity 指向可以接收多个参数并返回数组的函数。

    获取的结果 R.身份 R.身份 获取一个函数并返回一个函数,类似于第一种情况。

    使 R R.pipe 右管 到 :

    const fn = R.unapply(R.pipe(
      R.identity
    ))
    
    const result = fn(1, 2, 3)
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
        2
  •  2
  •   Scott Sauyet    7 年前

    看来你真的在想 pipe

    unapply(identity) ,你正在通过考试 identity 到 unapply

    但是当你尝试的时候 pipe(identity, unapply) ,则返回一个通过 后果 呼唤 到 不合时宜

    这种方法的有效性主要是巧合: pipe(identity, unapply)(identity) (...args) => unapply(identity(identity))(...args) . 自从 identity(identity) 只是 身份 ,这就变成了 (...args) => unapply(identity)(...args) 不适用(身份) . 这仅仅意味着一些重要的事情,因为 身份

        3
  •  1
  •   customcommander    7 年前

    你会用 unapply 要将通常将其参数作为数组的函数转换为可以接受任意数量位置参数的函数,请执行以下操作:

    sum([1, 2, 3]); //=> 6
    unapply(sum)(1, 2, 3) //=> 6
    

    除其他外,这允许您映射任意数量的位置参数:

    unapply(map(inc))(1, 2) //=> [2, 3]
    unapply(map(inc))(1, 2, 3) //=> [2, 3, 4]
    unapply(map(inc))(1, 2, 3, 4) //=> [2, 3, 4, 5]
    

    identity 将始终返回其第一个参数。所以 unapply(identity)(1,2) identity([1,2]) .

    如果您的最终目标是创建一个返回其参数列表的函数,那么我认为您不需要 pipe unapply(identity) 他已经这么做了。

    但是,如果您需要做的是确保管道以列表的形式获取其参数,那么您只需要包装 不合时宜 :

    const sumplusplus = unapply(pipe(sum, inc, inc));
    sumplusplus(1, 2, 3); //=> 8