// basic implementation of Option monad in C# public abstract class Option { public abstract Option map( Func fun); public abstract U match( Func somef, Func nonef ); public T unwrap_or(T default_val) { return match(some: v => v, none: () => default_val ); } // this functor is also called "bind" or "flatmap": public Option and_then( Func> flatfun ) => match(some: v => flatfun(v), none: () => Option.Nothing ); public static readonly Option Nothing = new None(); //1 time constant public static Option Make(T x) { // includes null-testing if (x!=null) return new Some(x); else return Nothing; } }//Option abstract type // concrete, non-public sealed classes (can't be further extended) sealed class Some : Option { private T val; public Some(T v) {val=v;} public override Option map(Func fun) => Option.Make(fun(val)); public override U match( Func somef, Func nonef ) => somef(val); } sealed class None : Option { public override Option map(Func fun) => Option.Nothing; public override U match( Func somef, Func nonef ) => nonef(); }