namespace Monads.IdentityMonad
public static void Main()
Func<int, Monad<int>> f1 = x => new Monad<int>(x * x);
Func<int, Monad<int>> f2 = x => new Monad<int>(2 * x);
Func<int, Monad<int>> composition = a => f1(a).Bind(b => f2(b));
Func<int, Monad<int>> compose2 = a => f1(a).Map(b=>f2(b)).Bind(x=>x);
Console.WriteLine(composition(2).Value);
Console.WriteLine(compose2(2).Value);
public Monad<T1> Bind<T1>(Func<T, Monad<T1>> func)
public Monad<T1> Map<T1>(Func<T, T1> func)
return new Monad<T1>(func(Value));