怪异函数语法



我看到了一个怪异的功能,看起来像:

const x = (a) => (b) => a + b;
console.log(x(1)(2))

输出为3,我知道这是一个函数返回函数,A和B都处于同一范围,但我遇到的问题是:

  1. 如何在现实生活中使用?
  2. 不使用2个参数并使用此功能的功能是什么优点(对于单行函数(?

在此闭合后,您可以获得具有恒定值的函数以供以后添加。

  1. 如何在现实生活中使用?

您可以将返回的功能用于数组的映射。

  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]

这很方便.then()链条打来的承诺:

  return fetchList (param)
    .then (map (add (5)))
    .then (filter (lessThan (8)))
    .then (average)

(当然,这需要咖喱功能addlessThanmapfilter,以及一些简单的average功能。(

将此与

进行比较
  return fetchList (param)
    .then (xs => xs.map (x => add (5, x)))
    .then (xs => xs.filter (x => lessThan (8, x)))
    .then (average)

请注意,average在这两个版本中都可以使用相同的原因是采用一个参数。咖喱的一个主要点是将一个函数转换为采用单个参数的函数。它使得编码更容易执行。

nina给出了一个很好的答案。我将提供另一个更高级的示例,其中此类封口对代码的清晰度有所帮助。让我们将函数合并到下面的前缀检查器中,然后根据需要重新使用它:

//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'));

实际上,它是一个简化的解析器 - 组合剂(不,尚未尚未单调(。扩展这种方法,您可以为自己的编程语言创建解析器,并且可以维护和快速。

最新更新