部分应用程序不适用于递归功能

时间:2019-09-03 20:16:25

标签: javascript recursion currying

此功能按预期工作:

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则返回一个函数。为什么?

2 个答案:

答案 0 :(得分:2)

您需要再次用字母调用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'))

答案 1 :(得分:1)

在咖喱版本中,您要使用两个参数来调用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'))