HaxeでのLambdaとかusingについて


はい、どーも、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を返す」関数で、各要素に関数値を適用します。

Sample.hx
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を返す」関数で、述語が真になる要素のみ返します。

Sample.hx
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の最初の要素を関数に適用し、そのあとは、前の結果と次の要素適用する関数です。

Sample.hx
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倍して合計を求めるプログラムです。

Sample.hx
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を使う。

Sample.hx
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

Sample.hx
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も ….

Sample.hx
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
    }
}

さっきのグロテスクなやつも….

Sample.hx
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さんですよろしくおねがいします。