public static ErrorProne <T2> Bind <T1, T2>(this ErrorProne <T1> a, Func <T1, ErrorProne <T2> > func)
 {
     if (a.IsError)
     {
         return(ErrorProne <T2> .Error(a.Exception));
     }
     try
     {
         return(func(a.Value));
     }
     catch (Exception e)
     {
         return(ErrorProne <T2> .Error(e));
     }
 }
 public static ErrorProne <T3> SelectMany <T1, T2, T3>(this ErrorProne <T1> a, Func <T1, ErrorProne <T2> > func, Func <T1, T2, T3> select)
 {
     return(a.Bind(aval => func(aval).Bind(bval => select(aval, bval).ToErrorProne())));
 }
 public static ErrorProne <T> ToErrorProne <T>(this T value)
 {
     return(ErrorProne <T> .Just(value));
 }