5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HaxeAdvent Calendar 2015

Day 17

Haxeでラムダ式を手短に描く

Posted at

Haxeとショートラムダ

Haxeは関数型プログラミング言語の影響下にあることを多くの点で指摘される言語ですが、シンプルなラムダ式(ショートラムダ)がありません。作者のNicolas Cannasseが可読性の低下などいくつかの理由から導入に前向きではないためです。

ライブラリで解決する

言語自体はサポートしていませんが、サードパーティーライブラリを使えばさくっとショートラムダで書くことができます。Haxeでショートラムダを実現するためのライブラリとしてはslambda, tink_langの2つが選択肢に上がります。今回はシンプルなライブラリの前者を使ってショートラムダを書きます。

Slambdaとは

Haxeでショートラムダを書くための小さめのライブラリ。スラムダと読みます。

Slambdaのインストールとhxmlの設定

こんな感じ。ここでは出力先にJavaScriptを指定していますが、特に出力先を限定するライブラリではありません。

haxelib install slambda
build.hxml
-main Lambdashiki.hx
-js Lambdashiki.js
-lib slambda

ショートラムダを書く

下記のようにショートラムダを書くことができるようになります。

Lambdashiki.hx
using Slambda;

class Lambdashiki{
    static function main(){
        var hoge:Array<Int>, piyo:Array<Int>, fuga:Array<Int>;
        var arr = [1, 2, 3, 4, 5];
        
        // arr.filter(function(x) { return x % 2 == 0 })と同じ
        hoge = arr.filter.fn(_ % 2 == 0);
        trace(hoge); // [2, 4]

        // アロー関数もいける
        piyo = arr.filter.fn(x => x % 2 == 0);
        trace(piyo); // [2, 4]

        // 連結できる
        fuga = arr.map.fn(x => x * x).filter.fn(_ % 3 == 0);
        trace(fuga); //[9]

    }
}

usingではなくimportを使うと下記のように書けます。

import Slambda.fn;

class Lambdashiki {
    static function main() {
        var hoge = [1, 2, 3].filter(fn(_ % 2 == 0));
        trace(hoge); // [2]
    }
}

上述のレポジトリでもう少しちゃんとしたサンプルを確認できます。

まとめ

Haxeでは言語自体はサポートしていないものの、ライブラリを使えば簡単に出力を限定せずショートラムダが使えます。functionreturnにつかれたときは思い出してください。

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?