【问题标题】:Partial application doesn't work in recursive function部分应用程序在递归函数中不起作用
【发布时间】:2019-09-03 20:16:25
【问题描述】:

此功能按预期工作:

const leftCharTrim = (c, s) => s.charAt(0) === c ? leftCharTrim(c, s.slice(1)) : s
console.log(leftCharTrim('a', 'abc'))

但是咖喱版不起作用:

const leftCharTrim = c => s => s.charAt(0) === c ? leftCharTrim(c, s.slice(1)) : s
const leftTrim = leftCharTrim('a') // partially applied
console.log(leftTrim('abc'))

由于leftCharTrim 收到了它的第一个参数,我希望leftTrim 是一个等待第二个参数的函数,并在接收到它时返回结果,但使用第二个参数调用leftTrim 返回一个函数。为什么?

【问题讨论】:

    标签: javascript recursion currying


    【解决方案1】:

    你需要用字母再次调用leftCharTrim,然后用第二个参数。

    const leftCharTrim = c => s => s.charAt(0) === c ? leftCharTrim(c)(s.slice(1)) : s
    //                                                             ^^^
    const leftTrim = leftCharTrim('a') // partially applied
    console.log(leftTrim('abc'))

    【讨论】:

    • 谢谢。忘记更改递归部分调用语法。
    【解决方案2】:

    在 curried 版本中,您使用两个参数调用 leftCharTrim,但它只需要一个并返回另一个函数。您还需要调用该函数。或者只是调用部分应用的函数:

    const leftCharTrim = c => {
      const trimC = s => s.charAt(0) === c ? trimC(s.slice(1)) : s
      return trimC;
    };
    const leftTrim = leftCharTrim('a') // partially applied
    console.log(leftTrim('abc'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2020-07-26
      • 2018-04-19
      • 2021-10-28
      • 1970-01-01
      • 2015-04-06
      相关资源
      最近更新 更多