pcwu's TIL Notes


[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:

Reference