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 が返される。
モナドクラスを作る必要性とかはおいおい考えましょう。