!!!言葉の定義 !!第一級関数 第一級関数(first-class function)とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のこと。 第一級オブジェクトとは、生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のこと。 簡単に言えば、 関数を変数に代入して扱える ってこと。 !例 {{code JScriptNET, var func = function(str){ return str + str; } }} !!高階関数 高階関数とは、関数(手続き)を引数にしたり、あるいは関数(手続き)を戻り値とするような関数のことである。 !例 {{code JScriptNET, function getFunction(){ return function(){ return "test2"; } } var func = getFunction(); alert(func()); }} !例2 {{code JScriptNET, var func = function(){ return "test"; } function connect(process, str){ return process() + str; } alert(connect(func, "test2")); }} !!カリー化 複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること !例 {{code JScriptNET, functio sum(x, y) { return x + y; } }} をカリー化すると {{code JScriptNET, function curried_sum(x) { return function (y) {return x+y;} } alert(curried_sum(2)(3)); }} !例2 Javaの場合 {{code Java, Function> func = s -> t -> s + t; System.out.println(func.getClass()); }} をカリー化すると {{code Java, Function cur = func.apply(3); System.out.println(cur.apply(4)); System.out.println(cur.apply(5)); }} !!部分適用 複数の引数を取る関数に対して、一部の引数を与えた関数を利用すること。 カリー化すると部分適用させやすくなるが、カリー化と部分適用は本来無関係。 !例 {{code JScriptNET, function curried_sum(x) { return function (y) {return x+y;} } var func = curried_sum(2); alert(func(3)); }} !!クロージャ 関数が定義された環境への参照を持つ関数。 !例 {{code JScriptNET, var x = 1; function Counter() { var n = 0; return function () { n = n + x; return n; }; } var a = Counter(); alert("a()=" + a()); alert("a()=" + a()); alert("a()=" + a()); alert("a()=" + a()); }} !!ラムダ式 型推論等を用いて短く定義した関数・・・・かな? よくわからない。 !例 Javaの場合 {{code Java, Function func = s -> "*" + s +"*"; }} {{category2 プログラミング言語,Java}}