わかりました、これはやり過ぎですが、実際に最近これに似たことをしました。
最初に、オプション タイプの計算式ビルダーを定義しました。
type OptionBuilder() =
member this.Bind(x, f) = Option.bind f x
member this.Return(x) = Some x
member this.ReturnFrom(x) = x
let opt = new OptionBuilder()
そして、タイプ float -> float -> float オプションの関数サブを定義しました
let sub x y = if y = 0.0 then None else Some (x / y)
最後に、OptionBuilder を使用して saveDiv を float オプション -> float オプション -> float オプションとして定義しました。
let safeDiv x y = opt { let! a = x
let! b = y
return! sub a b }
ウィキブックで計算式の詳細を読むことができます: http://en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions
この背後にある理論を深く掘り下げたい場合は、Tomas Petricek と Don Syme によるこの論文を読むことができます: http://www.cl.cam.ac.uk/~tp322/drafts/notations.pdf