柯里化,偏函数,Thunk这三个概念很相似的,今天就来看看有哪些区别。

柯里化(Currying)

把一个多参数的方法,改造成可以接受单一参数的方法,并返回接受剩余参数的新函数。实现:

代码的主要思路就是收集参数,如果参数的个数满足了,就可以执行了;如果参数的个数没达到,就继续调用返回闭包。

柯里化的主要目的是可以在只知道部分参数的情况下,可以先返回一个方法,等剩余参数获取了,就可执行了。

不过上面的柯里化只能从左往右收集参数,例如function test(a,b,c,d){},我开始只知道c,d参数,后来才知道a,b参数,上面那种就不行了。这种时候就要用一种占位符来先替代未知的参数,等后期参数来了我们再进行合并:

参数合并的规则有很多,上面的规则是如果遇到了_,就用新参数的;如果不是_就继续遍历。如果新参数遍历后有多余的,就合并在后面,看看下面的一些合并情况:

background Layer 1 (1,_,_,4) (2,3) (1,2,3,4) (_,_,_,4) (_,_,3) (_,_,3,4) (_,2) (1,3,4) (1,2,3,4)

偏函数(Partial)

偏函数就是固定部分参数,生成另外一个参数更少的方法。例如bind就是一个简单的偏函数:

先来看个简单的偏函数实现方式:

那么偏函数和柯里化有什么区别呢?柯里化是可以将n个参数的方法拆成n次调用;偏函数则是将n个参数的方法拆成n-x个参数调用和x参数的方法。

background Layer 1 function text(a,b,c,d){} 柯里化 偏函数 let handle=curry(text); handle(1)(2)(3)(4); handle(1,2)(3,4) handle(1)(2,3,4) handle(12,3)(4) let handle=curry(text,1); handle(2,3,4) let handle=curry(text,1,2); handle(3,4) let handle=curry(text,1,2,3); handle(4)

可以看到偏函数和柯里化的主要区别是,柯里化可以多次调用,最多可以调用n次,直到参数拼完整;偏函数只能调用一次,一次就要把所有的参数拼完整。

同样,偏函数也存在位置的问题,上面的是从左往右拼凑参数,如果先知道后面的参数,那么也需要用占位符:

其实我们可以发现偏函数就是柯里化的简单实现,代码实现上,柯里化比偏函数多了递归,因为偏函数只要调用一次就可以保证参数完整,而柯里化要收集参数,才能保证参数完整。

Thunk

Thunk方法主要使用在有cb(回调函数)参数的方法中,是指将参数拆分为cb部分和非cb部分:

在划分参数上和偏函数比较类似,偏函数是先固定部分参数,然后调用的时候参数拼凑完整;Thunk是将参数划分为非cb参数和cb参数,也是分为两拨,这是写法上有些许不同:

background Layer 1 function test(a,b,cb){} 偏函数 Thunk let handle= partial(test,1) handle(2,()=>{}); let handle= partial(test,1,2) handle(()=>{}); let handle=Thunk(test)(1,2) handle(()=>{})

我们可以看到,偏函数对多参数的划分不是唯一的,但是Thunk的划分是唯一的;Thunk对参数的调用更像柯里化,Thunk是调用了两次才完成参数拼凑,而偏函数只调用了一次。

那么这个Thunk函数有啥作用?其实主要实在异步流程中才会用到,例如Promise,Generator等,常常会将一个Thunk函数封装成一个Promise使用:

这样做的目的是为了让带有cb的方法使用起来和promise差不多,更多关于Thunk的使用方法后续文章会讲解。

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字