JavaScript で Maybe

オブジェクトが深くネストした JSONデータを扱う際に、途中のプロパティの存在チェックを毎回やるのが非常に手間で、こんなとき JavaScript にも Maybeモナドがあると便利なのになーとか常々考えてました。

と思っていたら RubyでMaybe なんて楽しげなことをやってるのを見かけたので、JavaScript でも書いてみようかと思い立った次第。

とりあえずモナド則を完全にガン無視でMaybeだけ書いてみました。

Maybe = {
    ret: function(e) {
        return new Just(e);
    },
}
function Just(e) {
    this.value = e;
}
Just.prototype.bind = function(func) {
    return func(this.value);
}
Nothing = {
    bind: function() {
        return Nothing;
    }
}

Haskell の do記法にあたる文法もないので fail も無視。

使い方はこんな感じ。

var data = {
    foo: {foo:"foo1", bar:"bar1", baz: "baz1"},
    baz: {foo:"foo3", bar:"bar3", baz: "baz3"},
};

var p = function(propertyName) {
    return function(obj) {
        var e = obj[propertyName];
        return e === undefined ? Nothing : new Just(e);
    };
}

alert(Maybe.ret(data).bind(p("foo")).bind(p("foo")).value); // "foo1" が返される。
alert(Maybe.ret(data).bind(p("bar")).bind(p("bar")).value); // エラーにならずに undefined が返される。

モナドクラスを作る必要性とかはおいおい考えましょう。