我看到了一个奇怪的函数,大概长这个样子:
const x = (a) => (b) => a + b;
console.log(x(1)(2))
输出结果是3,我知道这是一个返回一个函数的函数,而且a和b都在同一作用域内,但我有以下问题:
- 这在实际生活中如何使用?
- 与使用具有两个参数的函数相比,使用此方法(对于单行函数)有什么优点?
我看到了一个奇怪的函数,大概长这个样子:
const x = (a) => (b) => a + b;
console.log(x(1)(2))
const
x = a => b => a + b,
add5 = x(5);
console.log([1, 2, 3].map(add5));
让我们给那个函数取一个更好的名字:
const add = (a) => (b) => a + b
稍后您可以编写
[1, 2, 3, 4] .map (add (5)) //=> [6, 7, 8, 9]
这段文字比较易懂
[1, 2, 3, 4] .map ((n) => 5 + n) //=> [6, 7, 8, 9]
在 Promise 的一系列 .then()
调用链中,这非常方便:
return fetchList (param)
.then (map (add (5)))
.then (filter (lessThan (8)))
.then (average)
add
、 lessThan
、map
和 filter
,以及一些简单的average
函数。)
将其与以下内容进行比较:
return fetchList (param)
.then (xs => xs.map (x => add (5, x)))
.then (xs => xs.filter (x => lessThan (8, x)))
.then (average)
average
在这两个版本中起作用的原因是它只接受一个参数。科里化的一个主要优点是将函数转换为只接受单个参数的函数。这使得某种编码风格更容易实现。//given a word, check if a string s starts with this word
const literal = word => s => s && s.startsWith(word);
//allow to combine 2 literals with OR
const either = (p1, p2) => s => p1(s) || p2(s);
//allow to combine N literals
const any = (...parsers) => parsers.reduce(either);
//create a parser
const check = any(literal('cat'),literal('dog'),literal('cow'));
console.log('cat: ' + check('cat'));
console.log('dog: ' + check('dog is smart'));
console.log('cow: ' + check('cow 123'));
console.log('banana: ' + check('banana'));