Javascript 理解咖喱功能

Javascript 理解咖喱功能,javascript,typescript,Javascript,Typescript,我不熟悉Javascript和Typescript,我发现理解Typescript非常困难,特别是在curry函数和箭头语法方面 所有这些,我一直在使用Java中的语法来表示函数: function(param) { ..dosomething.. . } 启动javascript会产生箭头语法函数,我觉得很难理解。在typescript中,我遇到了咖喱,我有如下示例: const operationOnTwoNumbers = f => x => y => f(

我不熟悉Javascript和Typescript,我发现理解Typescript非常困难,特别是在curry函数和箭头语法方面

所有这些,我一直在使用Java中的语法来表示函数:

function(param) {
   ..dosomething..
   .
}
启动javascript会产生箭头语法函数,我觉得很难理解。在typescript中,我遇到了咖喱,我有如下示例:

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)
我没有听过这么详细的讲座,但根据我的幻灯片,它说乘法是一个常用的函数

首先也是最重要的,我想知道如何解释OperationOnTwoNumber箭头语法函数。现在,我将其解释为:

操作ntwonumbers是一个函数,它接受f作为参数,并返回一个以x作为参数的函数,该函数返回一个以y作为参数的函数,该函数返回一个对x和y执行操作的函数。

我的解释正确吗?我想得到一些反馈

现在是乘法curried函数。我的解释是:

乘法是一个函数,将OperationOnTwoNumber作为函数运算OnTwoNumber将(x,y)作为参数,返回一个将x和y相乘的函数

我很确定我对这些的解释在某种程度上是错误的,但我似乎无法理解语法。提供给我的资源没有太多解释,我试着用谷歌搜索,结果发现我越来越困惑


如果能在这方面提供一些帮助,我将不胜感激。

首先,让我们添加一些缺少的分号,因为如果没有分号,代码将以一种模糊的方式失败(ASI不会在
乘法(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。在所有不是以块结尾的流控制结构的语句末尾放置
。因此,在上面的位置会有一个,而在(条件){…}
语句上[比如说]也不会有一个。)

operationOnTwoNumbers是一个以f为参数的函数,它返回一个以x为参数的函数,该函数返回一个以y为参数的函数,该函数返回一个对x和y执行操作的函数

我的解释正确吗

非常接近“…它返回一个以y为参数的函数,该函数返回一个对x和y执行某些操作的函数。”不正确,应该是“…它返回调用
f
传入
x
y
的结果”(另外,从技术上讲,
f
x
y
都是参数,而不是参数,但称它们为参数是很常见的,这样做可能不会遇到太多麻烦。)因此,完整的解释是:
operationntwonumbers
是一个以
f
为参数的函数,返回一个以
x
为参数的函数,该函数返回一个以
y
为参数的函数,该参数返回调用
f
传递
x
y
的结果

查看等效的非箭头版本可能会有所帮助(因为这些函数除了简洁性之外,没有使用箭头函数的任何功能):

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

不完全是这样,
multiply
是调用
operationntwonumbers
并传入一个函数,
(x,y)=>x*y
(这成为
operationntwonumbers
中的
f
)。因此
multiply
是由接受
operationntwonumbers
创建的函数

然后,
double
是调用
multiply
2
的结果,因此
2
变成
x
double
是接受
y
的函数
,那么
3
就是
y
,既然
x
就是
2
f
就是
(x,y)=>x*y
,调用
double(3)
的结果就是
6

然后,
map
调用对数组中的每个条目调用
double
,返回一个新数组,每个值加倍


参数与参数:函数声明参数;调用函数时,为该参数提供参数。例如:

function example(v) {
    return v * 2;
}
console.log(example(7));

示例
中,
v
是一个参数(特别是一个形式参数),
7
v
参数的参数。

请注意,在提供的示例中,您没有使用TypeScript-仅使用ES6,它基本上是一个较新版本的JavaScript。我可能会在稍后有时间时给出更详细的解释。作为一个JS初学者,也许您最好远离curr我个人认为这是处理难以维护的函数的一种相当丑陋的方式。如果你不使用typescript,你会在你的
const double=multiply(2)[5,8,3,1,7,6,2].map(double)上出错
…因为它试图访问函数的索引…而typescript不一定需要任何类型表示法…
未捕获的TypeError:无法读取chrome代码段中未定义的
的属性“map”…
异常:TypeError:multiply(…)[2]在Firefox sc中未定义
function example(v) {
    return v * 2;
}
console.log(example(7));