namespace monad {
interface Monad<T> {
Monad<U> `>>=`((T -> Monad<U>) callback);
}
}
namespace optional {
interface Optional<T>: Monad<T> {}
class None: Optional<T> {
None() {}
None `>>=`((T -> Optional<U>) callback) {
return None();
}
}
class Some<T>: Optional {
private T value;
Some<T>(T value) {
self.value = value;
}
Optional<U> `>>=`((T -> Optional<U>) callback) {
return callback(value);
}
}
Some<T> return(T thing) {
return Some(thing);
}
}
Optional<String> =
Parser.parse(string) >>= (ast) ->
Type.check(ast) >>= (ast') ->
Ruby.render(ast');
Optional<String> =
Parser.parse(string) >>=
Type.check >>=
Ruby.render;
Last active
April 1, 2016 11:11
-
-
Save keleshev/2f08ef25af030af6fbfd70ccfbb95bda to your computer and use it in GitHub Desktop.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment