3 个回答

https://hackernoon.com/curryi...
题主英文好不,如果还可以的话,读完这篇基本就理解了


updated

不知道你是否有看我之前分享给你的文章。

既然你又更新了一下问题,想了解一下区别,我就简单说一些,如有错误,还望指正。

要理解两者之间的区别,你首先需要明白一个叫做偏函数(Partial Function)的概念,这个东西是 FP 中一个比较重要的知识点,抛去一些学术方面的东西,按我的理解,它是函数式编程中用来复用代码的一种手段,举个例子:

const add = x => y => x + y

const add2 = add(2)
const add3 = add(3)

add2(1) // 3
add3(1) // 4

如果直接使用二元参数的 add 方法的话,是这样的:

const add = (x, y) => x + y

add(2, 1) // 3
add(3, 1) // 4

虽然第二种写法比第一种写法代码量少一些,但在调用 add 时,对于业务的描述,与调用者的传参逻辑耦合在一起,但前者的话,就不存在这个问题,对于业务的描述很明显可以通过中间变量的命名来得知,add2 就是与 2 相加,add3 就是与 3 相加。对于 add2 和 add3 这种原子性的方法,你可以将它们独立抽离为一个单另的文件,可读性、可维护性、可测试性都大大提升。

如果直接这么来看,似乎是多此一举,因为我直接使用二元的 add 方法,也可以封装出来 add2 和 add3 的版本,但在 FP 中,一般是通过使用组合(Composition)来实现 OOP 中涉及的继承和多态的概念,因此,在上面的例子中,add2 和 add3 在实际的业务工作场景中,一般被抽象为具有原子性的业务逻辑,而这些逻辑互相组合起来,可以形成更加复杂的逻辑,就如同乐高积木一样。

但有一个问题就是,我们平时用的函数,不可能所有的都只有一个参数,因此,为了享受这种便利性,又不强迫我们每次写函数的时候,都使用唯一一个参数,使用柯里化来将一个多元参数转化为偏函数。

另外的一些区别就是,柯里化后的函数通过组合,在求值时是惰性的,在业务逻辑十分繁杂的情况下,性能会好一些。

在一个函数中首先填充几个参数,然后再返回一个新函数,通俗吧


function add(a){
    var sum = 0;
    sum += a;
    return function(b){
        sum += b;
        return function(c){
            sum += c;
            return sum;
        }
    }
}
 
add(1)(2)(3);//6
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题