部分应用程序在递归函数中不起作用
Partial application doesn't work in recursive function
此函数按预期工作:
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
是一个等待第二个参数的函数,并且在收到它后 returns 结果调用 leftTrim
第二个参数 returns 是一个函数。为什么?
您需要再次使用字母调用 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'))
在 curried 版本中,您使用两个参数调用 leftCharTrim
,但它只需要一个和 returns 另一个函数。您还需要调用该函数。或者只调用部分应用的函数:
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'))
此函数按预期工作:
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
是一个等待第二个参数的函数,并且在收到它后 returns 结果调用 leftTrim
第二个参数 returns 是一个函数。为什么?
您需要再次使用字母调用 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'))
在 curried 版本中,您使用两个参数调用 leftCharTrim
,但它只需要一个和 returns 另一个函数。您还需要调用该函数。或者只调用部分应用的函数:
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'))