static Monads.Function.OnDemand <R> ApplyFunction <A, R>(
     Monads.Function.OnDemand <A> onDemand,
     Func <A, R> function)
 {
     return(() =>
     {
         A unwrapped = onDemand();
         R result = function(unwrapped);
         return result;
     });
 }
 public static Monads.Function.OnDemand <R> ApplySpecialFunction <A, R>(
     Monads.Function.OnDemand <A> onDemand,
     Func <A, Monads.Function.OnDemand <R> > function)
 {
     return(() =>
     {
         A unwrapped = onDemand();
         Monads.Function.OnDemand <R> result = function(unwrapped);
         return result();
     });
 }