+type MaybeBuilder () =
+ member this.Bind (x, f) =
+ match x with
+ | None -> None
+ | Some a -> f a
+
+ member this.ReturnFrom x = x
+
+ member this.TryFinally (body, compensation) =
+ try
+ this.ReturnFrom (body ())
+ finally
+ compensation ()
+
+ member this.Using (disposable : 'a when 'a :> IDisposable, body) =
+ let body' = fun () -> body disposable
+ this.TryFinally (body', fun () ->
+ match disposable with
+ | null -> ()
+ | disp -> disp.Dispose ())
+
+ member this.Zero () =
+ None
+
+ member this.Return x =
+ Some x
+
+let maybe = MaybeBuilder ()
+
+type Result<'a> =
+ | Success of 'a
+ | Fail of string // Error message.
+
+type ResultBuilder () =
+ member this.Bind (res, f) =
+ match res with
+ | Success value -> f value
+ | fail -> fail
+
+ member this.ReturnFrom (x) = x
+
+let result = ResultBuilder ()