List モナドの mplus サンプル in JavaScript
前回の記事 で Listモナドと Maybeモナドの mzero/mplus について書きましたが、Maybe についての例しか出してなかったですね。
なので List モナドの例についても紹介しておこうと思います。
前回と同じくクローン羊の例を使います。
羊を表す Sheep クラスがあり、父親を返す father メソッドと 母親を返す mother メソッドが定義されているとします。ただクローン羊を扱っているので、必ずしも父親母親が居るとは限りません。father メソッドと mother メソッドは、父親母親が存在する場合に Just(Sheepインスタンス) を返し、存在しない場合に Nothing を返します。
function() { var Sheep = window.Sheep = function(f, m) { this._father = f; this._mother = m; } var CP = Sheep.prototype; CP.father = function() { return this._father != null ? new Just(this._father) : Nothing; } CP.mother = function() { return this._mother != null ? new Just(this._mother) : Nothing; } }();
さて、ここで存在している父親と母親を全て取得する parents メソッドを定義したいと思います。Listモナドを使うことで以下の様に書けます。
Sheep.prototype.parents = function() { return this.father().toArray().plus(this.mother().toArray()); }
さらに、存在している祖父母を全て取得する grandparents メソッドを定義したいと思います。前回と同じく callMethod を使用します。
Sheep.prototype.grandparents = function() { return this.parents().bind(callMethod("parents")); }
plus の強力さというより bind の強力さの例になっている気もしないではありませんが^^;;;