背景・動機
業務でReduxを利用していますが、公式サイトに以下のようなコードが現れビビったので調べました。
const middleware = store => next => action => {
next(action);
}
高階関数とは
関数を引数にとったり、関数を戻り値とする関数のこと。
カリー化とは
高階関数を使うと、以下のようなadd関数を定義することができます。
const add = function(a) {
return function(b) {
return a + b;
}
}
add(1)(2); // 3
addのように、引数を1つずつとって関数を返し、関数がつながっている状態にすることをカリー化と言います。
上記は簡略化して以下のように記述できます。
const add = a => b => a + b;
部分適用とは
カリー化された関数は、任意の引数を固定した別の関数を作成することができます。
これを部分適用と言います。
const add = a => b => a + b;
const add2 = add(2);
add2(3); // 5
どういったメリットがあるの?
関数を再利用する際に、毎回気にしなくて良い引数を固定化できます。
例えばAPI Requestを行う関数を考えてみます。
まずは部分適用を用いないパターン。
const apiRequest = (method, path, data) => {
return fetch(path, { method: method, body: JSON.stringify(data) });
}
apiRequest('GET', 'http://example.com', { param1: 'hogehoge' });
apiRequest('GET', 'http://example.com', { param2: 'hogehoge' });
apiRequest('GET', 'http://example.com', { param3: 'hogehoge' });
上記は部分適用を用いることで、以下のように記述できます。
const apiRequest = method => path => data => {
return fetch(path, { method: method, body: JSON.stringify(data) });
}
const get = apiRequest('GET');
const getExample = get('http://example.com');
getExample({ param1: 'hogehoge' });
getExample({ param2: 'hogehoge' });
getExample({ param3: 'hogehoge' });
引数を固定化することで、引数の数を減らしシンプルにできました。