参考:
https://www.jianshu.com/p/33392cb4b055
https://ruby-china.org/topics/38385
https://stackoverflow.com/questions/36314/what-is-currying
柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,
并且返回接受余下的参数且返回结果的新函数的技术。
这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的。
简单的javascript例子:
function add(x, y){ if(y===undefined){ return (z) => x + z; }else{ return x+y; } } 测试 add(1)(2)和add(1, 2)都返回3.
我理解currying,即乐高模块化,如果要写一个复杂函数,可以分解成单一功能的模块,然后组装在一起。这样每个模块就可以在其他函数进行反复调用了。
例子:
对已知数组的已知量进行加N的操作,传统的写法:
let ar= [1,2,3]; function addToArray(ar,n){ return ar.map((x)=> x+n) }; console.log(addToArray(ar,1)
但可以这么写:
const add = a => b => a+b; const addToArray = (ar,n) => ar.map(add(n)); addToArray([2,3],1)
Currying的好处:
上面连个例子结果相同,但过程不一样:
第一是新写了一个函数,对数组进行map操作,
第二则是在直接在map
里进行add
操作,这很通用,一旦你写了很多类似于add
的函数,就会方便起来,可以让我们方便的在map
,reduce
,filter
里调用。
- 能够进行延迟计算,就像add(1)(2)一样,1比2先传入,2就会被延迟计算,在特定的场景里,有一定的应用意义。
- 当你发现你要调用一个函数,并且调用参数都是一样的情况下,这个参数就可以被柯里化,以便更好的完成任务。
- 优雅的写法,允许你写出来的代码更干净、更有表达力。
虽然柯里化在日常应用不多,但仍然是一个不可不了解的好概念。