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 の強力さの例になっている気もしないではありませんが^^;;;