Currying 及应用
Currying,中文多翻译为柯里化,感觉这个音译还没有达到类似 Humor 之于幽默的传神地步,后面直接使用 Currying。 什么是 CurryingCurrying 是这么一种机制,它将一个接收多个参数的函数,拆分成多个接收单个参数的函数。 考察下面的代码: function add (a, b) {
经过 curry 化处理后,函数成了如下形式: function add (a) { 现在 add(3)(4); var add3 = add(3); add3(4); 现在当调用 而 注意这里提到了将入参 3 保存 到了闭包中后续使用,很容易联想到 function.bind(thisArg[, arg1[, arg2[, ...]]]) 后面会看到,正因为 注意到 Currying 化的定义,其实是将多个参数打散到多个函数中,这个过程可通过代码来自动化,以达到将任意多入参函数进行 Currying 化的目的,后面讨论实现。 偏函数/Partial Application区别与 Currying,如果在拆分入参的过程中,这些拆分出来的函数不是一次只应用其中的一个,而是任意多个,则这些函数就是部分应用(Parital application)了原函数中的入参,称作偏函数。 考察下面的 function add(a, b, c, d) { 那么如下的函数就都是偏函数,它们都部分应用了 function partial1(a) { 偏函数中这种入参的拆分和部分应用,并不仅限于一层的拆分,可以是任意多次的: function partial1(a, b) { 其中, 可以看到,偏函数是 Curring 更加一般(general)的形式,下面看如何实现将任意函数进行 Currying 化,或偏函数化。 将一般化函数进行 Currying 化我们需要构造这么一个函数假设名叫 function curry(fn){ 调用 function add (a, b) { 即上述 function currified (a) { 首先,通过 再加上前面提到的 function curry(f) { 下面测试一下: function add(a, b) { 并且以上实现不只是简单的 Currying 化,可以是任意数量和任意次数的 parial application: function add(a, b, c, d) { 总之就是各种形状和(hàn)姿势,各种颜色和(hàn)皮肤的组合。 自动化的 CurryIng 倒是实现了,可说了半天,它具体有什么实用价值。 函数的组合(function composition)我们知道代数里面可以有函数的组合,譬如:
上述代数表达转成 JavaScript 即: function f(x) { 这里用到了两个函数 像这样只接收一个入参并返回一个结果的函数,便符合组装的需求,可像上面这样自由组合。通过上面的讨论我们知道,任意函数都可经过 Currying 化处理后变成多个只接收单个入参的函数。这就为函数的组合提供了基础。 因此我们可以将 const compose = fn1 => fn2 => input => fn1(fn2(input)); 使用: const myFn = compose(f)(g); 像上面的 const pipe = (...fns) => input => fns.reduce((mem, fn) => fn(mem), input) const double = x => x 2 上面的 以上,函数的组装。 相关资源
|
最新文章
- yii小细节
- golang中的slice翻转存在以及map中的key判断
- Sprint(第八天11.21)
- 用 python 实现一个多线程网页下载器
- ASP怎么解除文件上传200kb限制
- shell常用代码积累
- spring Transaction Management --官方
- Dll方式的线程,需要引用这个
- c语言10个经典小程序
- 优酷DEMO
- weak引用变量是否线程安全
- 快学Scala-第六章 对象
- 回顾2017系列篇(一):最佳的11篇UI/UX设计文章
- oracle wm_concat 函数无法使用的情况下,使用LISTAGG()函数
- 九.django模型基础(三)之关联对象操作及多表查询
- 轻量级应用程序Dynamics 365 App for Outlook介绍
- 486A
- 运行go服务器后台挂起(不看调试信息)
- cat查看文件以及sed查看指定行数
- SQL SERVER 子查询使用Order By;按In排序