Maybe<int> v = new None<int>();
.Bind(x => new Some<int>(x + 3))
Console.WriteLine(result);
public abstract class Maybe<T>
public abstract Maybe<T1> Map<T1>(Func<T, T1> f);
public abstract T1 MatchWith<T1>((Func<T1> none, Func<T, T1> some) pattern);
public Maybe<T1> Bind<T1>(Func<T, Maybe<T1>> f) =>
none: () => new None<T1>(),
public class None<T> : Maybe<T>
public override Maybe<T1> Map<T1>(Func<T, T1> f) => new None<T1>();
public override T1 MatchWith<T1>((Func<T1> none, Func<T, T1> some) pattern) => pattern.none();
public class Some<T> : Maybe<T>
private readonly T value;
public Some(T value) => this.value = value;
public override Maybe<T1> Map<T1>(Func<T, T1> f)=> new Some<T1>(f(this.value));
public override T1 MatchWith<T1>((Func<T1> none, Func<T, T1> some) pattern) => pattern.some(this.value);