Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
270
Help us understand the problem. What is going on with this article?
@nouka

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

More than 1 year has passed since last update.

背景・動機

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

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

270
Help us understand the problem. What is going on with this article?
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
nouka
WEBデザイナーからエンジニアに転向し、現在はリードエンジニア的な立場で働いています。 好きな本:「コードコンプリート」「リーダブルコード」「レガシーコード改善ガイド」「JavaScript: The Good Parts」「メンタルブロックバスター」
ozvision
購買プラットフォーム「ハピタス」を開発・運営するベンチャー企業

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
270
Help us understand the problem. What is going on with this article?