Skip to content

Instantly share code, notes, and snippets.

@nakamura-to
Created July 31, 2013 13:34
Show Gist options
  • Save nakamura-to/6122012 to your computer and use it in GitHub Desktop.
Save nakamura-to/6122012 to your computer and use it in GitHub Desktop.
JavaScriptにおいてはObject型が成功と失敗を同時に表す型。 つまり、値がnullまたはundefinedならば失敗を表し、それ以外なら成功を表す。 その前提でMaybeのモナド則を書くと。。。
var maybe = {
'return': function (value) {
return value;
},
'bind': function (value, f) {
if (value == null) return null;
return f(value);
}
};
(function () {
console.log('Monad law 1');
var f = function(a) { return maybe.return(a * 3); };
var lhs = maybe.bind(maybe.return(5), f);
var rhs = f(5);
if (lhs !== rhs) throw Error('Monad law 1');
}());
(function () {
console.log('Monad law 2');
var m = maybe.return(5);
var lhs = maybe.bind(m, maybe.return);
if (m !== lhs) throw Error('Monad law 2');
}());
(function () {
console.log('Monad law 3');
var f = function(a) { return maybe.return(a * 3); };
var g = function(a) { return maybe.return(a * 5); };
var m = maybe.return(7);
var lhs = maybe.bind(maybe.bind(m, f), g);
var rhs = maybe.bind(m, function(x) { return maybe.bind(f(x), g); });
if (lhs !== rhs) throw Error('Monad law 3');
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment