関数型プログラミングについてメモ

Last-modified: 2015-02-19 (木) 20:02:43

第一級関数 : 関数を変数に格納できること(関数が値にできる)
例(JavaScript)
var func = function(){};

高階関数 : 関数を返す関数と関数を引数として受け取る関数が作成できること(関数を関数を渡して、関数を返すことができる)
例(JavaScript)(関数を返す関数)
var func = function() {

   return function() {};

}
例(JavaScript)(関数を受け取る関数)
var func = function(f) {

   f();

}

純粋関数 : 関数の返す値が引数のみで決定され、同じ引数ならば同じ結果になること(関数に副作用がなく、入力は引数、出力は返す値だけ)
例(JavaScript)(純粋関数の例)
var func = function(a, b) {

   return a + b;

}
例(JavaScript)(純粋関数でない例)
var c = 0;
var func = function(a, b) {

   c++;
   return a + b + c;

}

クロージャ : 関数が作った際に関数からのみアクセスできるデータを持てること(関数を作成する際に、関数内で関数外の一時変数を使用できて、一時変数が失われた後も関数が残っている場合は値を保持している)
例(JavaScript)(常に1を返す関数を返す関数、戻り値になっている関数のクロージャに変数xの値(1)が保持されている)
var func = function() {

   var x = 1;
   return function() {
       return x;
   };

}

不変状態 : 一度作成した値は変更できないこと、配列やオブジェクトの場合、その内部の値も(日付型のオブジェクトなら「値をn日後にする」ではなく「n日後の値を返す」と実装+再代入の禁止)