#概要
第一級関数・・・変数や配列(第一級オブジェクト)と同じように扱える関数
高階関数・・・第一級関数を引数として取る関数のこと
Javascriptは第一級関数な言語で使いやすいので以下Javascriptでやっていきます。
第一級関数な言語は以下に載ってます。
https://ja.wikipedia.org/wiki/第一級関数
例:マップ関数
function add2(n) {
return n + 2;
}
const arr = [1,2,3];
const result = arr.map(add2);
console.log(arr);
console.log(result);
// > [1, 2, 3]
// > [3, 4, 5]
#関数を作る関数
第一級関数と高階関数を使うことができれば、同じ処理を関数でまとめてしまうかのようにダブっている部分をまとめることができます。
例えば2つの配列の各要素を四則演算する関数は四則演算子以外すべて同じです。
function addArray(arrA, arrB) {
return arrA.map(function(_, i) {
return arrA[i] + arrB[i];
});
}
function mulArray(arrA, arrB) {
return arrA.map(function(_, i) {
return arrA[i] * arrB[i];
});
}
function subArray(arrA, arrB) {
return arrA.map(function(_, i) {
return arrA[i] - arrB[i];
});
}
function subArray(arrA, arrB) {
return arrA.map(function(_, i) {
return arrA[i] / arrB[i];
});
}
ダブっているところを高階関数でまとめてしまいましょう。
(残念なことにJavascriptでは演算子は第一級オブジェクトでは無いので関数で改めて定義してあります。)
function add(a, b) { return a + b; }
function mul(a, b) { return a * b; }
function sub(a, b) { return a - b; }
function div(a, b) { return a / b; }
function makeFunction(fn) {
return function(arrA, arrB) {
return arrA.map(function(_, i) {
return fn(arrA[i], arrB[i]);
});
}
}
var addArray = makeFunction(add);
var mulArray = makeFunction(mul);
var subArray = makeFunction(sub);
var divArray = makeFunction(div);
makeFuncitonは関数(この場合は四則演算関数)を引数に取り、返り値として関数を返えす関数です。
内容は上のもののダブっていたとこはそのままに四則演算部分を関数で置き換えた関数を返しています。
#最後に
この手の関数の利用はLisp(commonlispやscheme)で学ばせてもらいました。あちらにはもっと自由で抽象的なマクロもあるので関数型プログラミング言語をやってみたい方はぜひLispを使ってみてください。Lispの宣伝でした。