Help us understand the problem. What is going on with this article?

高階関数、カリー化、部分適用

背景・動機

業務で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' });

引数を固定化することで、引数の数を減らしシンプルにできました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away