「JavaScriptパターン」の中で出てきた部分適用とカリー化がちょっと混乱したので、いろいろと参考にまとめてみました。

部分適用とは?

関数の部分適用とは仮引数の一部の値を固定して、新たに関数を作ることです。 まずは2つの値を足し算した値を返す関数を普通に書いてみます。

var add = function(a, b){ //a,bが仮引数
  return a + b;
};

console.log(add(1,2)); //3 1,2が実引数

a,bがこの関数の仮引数です。ではaの値を1で固定してあらたに関数を作ります。 部分適用にはFunction.prototype.bind()を使用するとできるそうです。

Function.prototype.bind() - JavaScript | MDN
//部分適用
var add = function(a, b){
  return a + b;
};

var _add = add.bind(undefined, 1);
console.log(_add(2)); //3

.bind()の第一引数は新たに作られる関数のthisの値を指定します。 そして、それ以降の引数は、ターゲット関数(ここではadd())の引数にあらかじめ固定した値をいれて、新たな関数を作り出すことができます。

この場合、_addにはadd()のaに1が既に入っている関数を渡します。 このような処理を部分適用といいます。

カリー化とは?

カリー化を調べたときwikipediaにはこんな風に書かれてました。

カリー化 (currying) とは、計算機科学分野の技法の一つ。複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。 カリー化 - Wikipedia

さっきのadd()をカリー化してみるとこんな感じになります。

//カリー化
var add = function(a){
  return function(b){
    return a + b;
  };
};

console.log(add(1)); //function(b){return a + b;};
console.log(add(1)(2)); //3

add()の引数に最初の引数aを指定して、returnの関数にbを指定します。 今まで通りadd()を呼び出すと中身の関数がかえってきます。 このような場合はadd()()と括弧を2つくっつけたかたちで呼び出します。

カリー化した関数を使えば部分適用をした新たな関数をつくることが可能です。

//カリー化
var add = function(a){
  return function(b){
    return a + b;
  };
};

_add = add(1);
console.log(_add(2)); //3

こんな風にカリー化した関数の一部の引数を指定して、あらたな関数をつくりだせば、部分適用が可能になるみたいです。

カリー化と部分適用がごちゃごちゃになっていたのですが、今回まとめてみて何となく理解できた気がします。

下記の記事を参考にしました。みなさまありがとうございました。 カリー化を駆使して空も飛べるはず(JavaScript おれおれ Advent Calendar 2011 – 2日目 JavaScript でカリー化 - Qiita

何か間違いなどあればご指摘いただけると幸いです。