376
275

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

背景・動機

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

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

376
275
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
376
275

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?