LoginSignup
12
12

More than 5 years have passed since last update.

HaxeでのLambdaとかusingについて

Last updated at Posted at 2013-12-04

はい、どーも、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さんですよろしくおねがいします。

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12