JavaScript 函数式编程中的 curry 实现

最近在学习javascript函数式编程,对其中大名鼎鼎的curry十分感兴趣,curry函数可以接受一个函数,我们暂且称之为原始函数,返回的也是一个函数,柯里化函数,这个返回的柯里化函数功能十分强大,他在执行的过程中,不断的返回一个贮存了传入参数的函数,直到触发了原始函数执行的条件。这么说比较概括,那么就举个例子来说明一下:

原始函数:

柯里化函数:

这个add需要两个参数,但是我们的curryAdd执行可以传入更少的参数,当传入的参数少于add需要的参数的时候,add函数并不会执行,curryAdd就会将这个参数记下来,并且返回另外一个函数,这个函数可以继续执行传入参数,我们会有一个变量专门记录传入参数的情况,如果传入参数的总数等于add需要参数的总数,我们就激活了原始参数执行,就会返回我们想要的结果。

还是很不错的是吧,好吧,我们的目的是为了写出这个神奇curry函数,而且还要一行写出来,不要着急,先分析一下怎么去写,然后再一步步的优化。

那根据上面的描述,我们看一下curry函数需要什么,首先需要一个变量,用来存下来原始函数的参数个数,我们知道function有一个属性为length,对就是它,我们用limit存下来

curry函数要返回一个函数, 这个函数是要执行的,那么问题就是,我们要判断这个函数的执行是否激活了原始函数的执行,问题就出现在传入的参数上面。返回函数还是结果?这的确是一个问题,我们先写返回结果的情况,当传入的参数等于原始函数需要的参数时,我们执行原始函数fn

否则呢 我们就要返回一个贮存了参数的函数,这里有两点,一是参数的传入历史我们要记录下来,二是这个返回的函数需要做些什么

看出来了吧 我们只需要把返回函数执行的参数累加起来就达到了记录参数传入情况的目的,于是我们想到了concat 对 args.concat(args2), 依次类推,我们返回的函数要做的就是重复做上面的事情,也就是参数为args的函数要做的事情,所以他需要一个名字,不然我们没法执行,我们叫它judgeCurry

所以正如我们所说的,要么返回一个函数,要么执行原始函数。

我们终于写完了这个神奇的curry函数,它真的很强大,配合compose,那真是一个字,爽。

我们的目的还是一行把上面那个函数写出来,一行写?怎么写?对了,用ES6啊,于是一番折腾

好,我们看一下哪有问题,对了,就是我们为了不用limit参数,用了就得赋值,赋值就不能一行搞定了,就会变成这样

需要判断参数的时候不断的对fn.length求值,但是fn.length的值是确定的,我们不想每次都求值,但又不想用limit怎么办,有什么办法呢?你一定想到了,立即执行函数!!

不得不感叹javascript的神奇,终于,我们就一行将这个神奇的curry写出来了。

原文发布于微信公众号 - java一日一条(mjx_java)

原文发表时间:2017-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

那些经常被遗忘的 Java 面试题

静态内部类实际上与普通类(即类名必须与文件名一样的顶级类)一样,只是静态内部类在某一类的内部定义了而已,既然是类,要想使用就必须实例化。概念上与静态变量、静态方...

751
来自专栏PPV课数据科学社区

走近 Python (类比 JS)

Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 ...

41610
来自专栏青玉伏案

在Objective-C中浅谈面向对象

  接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习O...

1886
来自专栏十月梦想

php字符串基本操作

字符串查找strstr(查找目标字符串,查找关键词),stristr(查找目标字符串,查找关键词)

691
来自专栏小古哥的博客园

秒懂JS对象、构造器函数和原型对象之间的关系

学习JS的过程中,想要掌握面向对象的程序设计风格,对象模型(原型和继承)是其中的重点和难点,拜读了各类经典书籍和各位前辈的技术文章,感觉都太过高深,花费了不少时...

3257
来自专栏HTML5学堂

操作符与数据类型转换

上一期堡堡给大家讲解了关于JS的基础语法,虽然是一些非常基础的知识,但是它对大家的后期学习奠定了一定的基础。知识像一张网,基础越扎实,网住的鱼就越多,要告诉大家...

3118
来自专栏追不上乌龟的兔子

为什么Python中的None is None is None == True

最近在StackOverflow上看到了一个问题,为什么Python中的None is None is None返回True,看到大家的讨论后对Python中的...

9487
来自专栏前端那些事

this四种绑定方式之间的奇淫技巧

写在前面 上一篇中,我们对于JavaScript中原始值、复杂值以及内存空间进行了一个深入浅出的总结,这次我们来聊一聊JavaScript中this关键字的深入...

1926
来自专栏小樱的经验随笔

KMP算法学习(详解)

kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简...

3155
来自专栏较真的前端

前端面试题“七连击”(一)

2037

扫码关注云+社区

领取腾讯云代金券