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