了解柯里函数

时间:2018-08-09 12:15:43

标签: javascript typescript

我是Javascript和Typescript的新手,我发现很难理解Typescript,特别是在curry函数和箭头语法方面。

在我一直在使用语法的时候,所有这些都来自Java中的函数:

function(param) {
   ..dosomething..
   .
}

和启动javascript会导致箭头语法功能,我觉得很难理解。在打字稿中,我遇到了currying,其中有以下示例:

const operationOnTwoNumbers = f => x => y => f(x,y)

const multiply = operationOnTwoNumbers((x,y) => x*y)

const double = multiply(2)

[5,8,3,1,7,6,2].map(double)

我没有得到那么多细节的演讲,但是根据我的幻灯片,它说乘法是一种咖喱函数。

首先,我想知道如何解释operationOnTwoNumbers箭头语法功能。现在,我将其解释为:

operationOnTwoNumbers 是一个函数,它以 f作为参数,并返回一个以 x作为参数的函数< / strong>返回一个以 y作为参数的函数,该返回一个对进行某些操作的函数。

我的解释正确吗?想要一些反馈。

现在为乘积函数。我的解释是:

将operationOnTwoNumbers作为函数 operationOnTwoNumbers以(x,y)作为参数并且返回将x和y相乘的函数

我很确定我对这些的解释在某种程度上是错误的,但是我似乎无法理解其语法。我提供的资源并没有太多解释,我尝试使用Google搜索,只是发现自己变得更加困惑。

真的很感谢您的帮助,这是我的理解。

1 个答案:

答案 0 :(得分:2)

首先,让我们添加一些缺少的分号,因为没有它们,代码将以晦涩的方式失败(ASI不会在;multiply(2)之间添加[5,8...,因为它们在一起在语法上有效,尽管在逻辑上是荒谬的)。我们还要在最后一行添加console.log

const operationOnTwoNumbers = f => x => y => f(x,y);
const multiply = operationOnTwoNumbers((x,y) => x*y);
const double = multiply(2);
console.log([5,8,3,1,7,6,2].map(double));

(您已经说过,您对JavaScript和TypeScript刚起步。我强烈建议不要依赖ASI。将;放在所有不会流的语句的末尾-control结构以块结尾。因此,在上面的位置中有一个,而在while (condition) { ... }语句上不会有一个。)

  

operationOnTwoNumbers是一个将f作为参数的函数,并返回以x作为参数的函数,该函数返回以y作为参数的函数,该函数返回对x和y做某事的函数。

     

我的解释正确吗?

非常接近。 “ ...返回一个以y作为参数的函数,该参数返回一个对x和y做某事的函数。” 是不正确的,应该是“ ...那个返回传入fx的调用y的结果。” (从技术上讲,fx和{{1 }}是参数,而不是参数¹,但是将其称为参数很普遍,这样做的麻烦也不太大。)因此,完整的解释是:“ y是一个以operationOnTwoNumbers作为参数,并返回以f作为参数的函数,该函数返回以x作为参数的函数,该函数返回调用{ {1}}传入yf。”

查看等效的非箭头版本可能会有所帮助(因为这些功能未使用箭头功能(除了简洁以外)的任何功能)

x
  

multiply是一个以operationOnTwoNumbers作为函数的函数,该operationOnTwoNumbers以(x,y)作为参数并返回一个将x和y相乘的函数。

不完全是,y是调用const operationOnTwoNumbers = function(f) { return function(x) { return function(y) { return f(x,y); }; }; }; 并传入函数multiply(在{中成为operationOnTwoNumbers {1}})。因此(x, y) => x * yf创建的接受operationOnTwoNumbers的函数。

然后multiply是用operationOnTwoNumbers调用x的结果,因此double变成multiply,而2是接受{ {1}}。例如,如果我们进行2,则xdouble,并且由于ydouble(3)3是{{1} },调用y的结果是x

然后2调用为数组中的每个条目调用f,返回一个新数组,每个值加倍。


¹参数参数:函数声明了参数;当您调用一个函数时,将为该参数提供一个参数。例如:

(x, y) => x * y

double(3)中,6是一个参数(特别是正式参数)。在调用map中,doublefunction example(v) { return v * 2; } console.log(example(7)); 参数的参数。