using System; class Maybe { public readonly static Maybe Nothing = new Maybe (); public T Value { get; private set; } public bool HasValue { get; private set; } Maybe () { HasValue = false; } public Maybe (T value) { Value = value; HasValue = true; } public override string ToString () { if (HasValue) return Value.ToString (); return string.Empty; } public Maybe SelectMany (Func> k) { if (!HasValue) return Maybe.Nothing; return k (Value); } public Maybe SelectMany ( Func> selector, Func resultSelector) { if (!HasValue) return Maybe.Nothing; Maybe n = selector (Value); if (!n.HasValue) return Maybe.Nothing; return resultSelector (Value, n.Value).ToMaybe (); } } static class MaybeExtensions { public static Maybe ToMaybe (this T value) { return new Maybe (value); } } class Test { public static void Main () { Console.WriteLine ( from x in 1.ToMaybe () from y in 2.ToMaybe () from z in 3.ToMaybe () select x + y + z); } }