はい、どーも、Haxeの記事を書かせていただきます。
前回は、functionについて書いたので、今度はHaxeのLambdaクラスについて書きまう。
Lambda解説
HaxeのAPIには、Lambdaというクラスがあります。
これは、何か?というと、Lambdaの名前が付いているようにHaxeで関数型プログラミングを支援するクラスです。
正確に言えば,HaxeのIterableのクラスと関数型のためのクラスなのです。
全部 public static function!
まぁ、全部が全部public static functionです。コンストラクタもありません。なので、new してインスタンス化することはありません。(というか、コンストラクタがないので、できないってことですが。)
実はこれは、Haxeのusingの機能のためです。これは後述します。
mapとか,filter, foldとか、つかってみる。
とりあえず、つかってみる
map
はい、良くあるやつです。Haxeでは、「iteratorと関数」をとり、「iteratorを返す」関数で、各要素に関数値を適用します。
class Sample{
public static function main(){
var array = [1,2,3];
var array1 = Lambda.map(array, function(x){ return x + 1; });
trace(array1); // => {2,3,4}
}
}
filter
はい、またまた良くあるやつです。「iteratorと述語関数」をとり、「iteratorを返す」関数で、述語が真になる要素のみ返します。
class Sample{
public static function main(){
var array = [1,2,3,4,5,6,7,8,9,10];
var array1 = Lambda.filter(array, function(x){ return x % 2 == 0; });
trace(array1); // => {2,4,6,8,10}
}
}
fold
はい、またまたまた良くあるやつです。「iteratorと2引数関数と初期値」を引数にとり、最初に初期値と、iteratorの最初の要素を関数に適用し、そのあとは、前の結果と次の要素適用する関数です。
class Sample{
public static function main(){
var array = [1,2,3,4,5,6,7,8,9,10];
var result = Lambda.fold(array, function(x,y){ return x + y; }, 0);
trace(result); // => 55
}
}
まぁお馴染すぎて、飽きました。
usingで便利に!
Lambda.~と毎回書くのは面倒臭い!!!!
はいはい、Lambda.map とは、Lambda.filterとか、Lambda.foldとか書くのだるいですよね。
3回Lambdaを使うだけで大変なことになります。
以下、1~10までの偶数を2倍して合計を求めるプログラムです。
class Sample{
public static function main(){
var result = Lambda.fold(
Lambda.map(
Lambda.filter(
[0,1,2,3,4,5,6,7,8,9,10],
function(x){ return x % 2 == 0; }),
function(x){ return x * 2; }),
function(x,y){ return x + y; },
0);
trace(result);
}
}
と…とでもグロテスクです!!!
そのためにusingというHaxeの機能があります
そのためにusingで便利に!!
Haxeにはusingという機能があります。
usingでmapを使う。
using Lambda;
class Sample{
public static function main(){
var array = [1,2,3];
var array1 = array.map(function(x){ return x + 1; });
trace(array1);
}
}
あれれ~? iterableクラスにmapメソッドが!!?
filterをusing
using Lambda;
class Sample{
public static function main(){
var array = [1,2,3,4,5,6,7,8,9,10];
var array1 = array.filter(function(x){ return x % 2 == 0; });
trace(array1); // => [2,4,6,8,10]
}
}
まるで、filterも同様です。
foldも ….
using Lambda;
class Sample{
public static function main(){
var array = [1,2,3,4,5,6,7,8,9,10];
var array1 = array.fold(function(x,y){ return x + y; }, 0);
trace(array1); // => 55
}
}
さっきのグロテスクなやつも….
using Lambda;
class Sample{
public static function main(){
var result = [1,2,3,4,5,6,7,8,9,10]
.filter(function(x){ return x % 2 == 0; })
.map(function(x){ return x * 2; })
.fold(function(x,y){ return x + y; }, 0);
trace(result);
}
}
読みやすくなりましたね?
どうして?
Haxeのusingおかげです!
Lambdaが、public staticメソッドだらけなのは、usingの為にあるのです。
そのことについてusingについて詳しくは次の記事にでも。
まとめ
Lambdaはusingを使うと便利!
あしたは、誰も書かなかったら僕がかきまう。
6日目は@hatchineeさんですよろしくおねがいします。