Skip to content

Instantly share code, notes, and snippets.

@keleshev
Last active April 1, 2016 11:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keleshev/2f08ef25af030af6fbfd70ccfbb95bda to your computer and use it in GitHub Desktop.
Save keleshev/2f08ef25af030af6fbfd70ccfbb95bda to your computer and use it in GitHub Desktop.
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;               
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment