[JS] Functional Programming: Curry
Intro
Curry 的概念很簡單,對於需要多個參數的函式,只傳遞部份的參數,讓它回傳一個函式。
日後再給予其他參數讓它完整處理整個函式的事情。
const add = function(x) {
return function(y) {
return x + y;
};
};
const increment = add(1);
const addTen = add(10);
increment(2);
// 3
addTen(2);
// 12
這是一種預載能力,透過預載參數,讓函式記住某些參數,可以讓應用變化很大。
像上面的例子,原始的函式只是兩數相加,但透過簡單「預載」,即可以產生「加1」和「加10」兩種新的函式。如果再透過 compose
等技巧,可以透過少少程式碼,預載組合出各種不同的用處的函式。
Curry in Ramda.js
像 ramda.js 內大部份吃2個參數以上的函式都是可以 curry 化的。
如果需要進一步不考慮位置的話,ramda.js 也有提供 __
來先佔住位置,日後再做替換:
var greet = R.replace('{name}', R.__, 'Hello, {name}!');
greet('Alice'); //=> 'Hello, Alice!'
R.__
先佔住了位置,日後回傳的函式傳入會再代入該位置。
If g is a curried ternary function and _
is R.__
, the following are equivalent:
g(1, 2, 3)
g(_, 2, 3)(1)
g(_, _, 3)(1)(2)
g(_, _, 3)(1, 2)
g(_, 2, _)(1, 3)
g(_, 2)(1)(3)
g(_, 2)(1, 3)
g(_, 2)(_, 3)(1)
Reference
-
https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch4.html#不可或缺的-curry
-
[http://ramdajs.com/docs/#](http://ramdajs.com/docs/#)
-
http://vividanote.blogspot.de/2015/11/introduction-to-functional-programming.html