好的,这有点矫枉过正,但我最近实际上做了类似的事情。
首先,我为选项类型定义了一个计算表达式构建器:
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 选项的函数 sub
let sub x y = if y = 0.0 then None else Some (x / y)
最后我使用 OptionBuilder 将 saveDiv 定义为浮动选项 -> 浮动选项 -> 浮动选项
let safeDiv x y = opt { let! a = x
let! b = y
return! sub a b }
您可以在 wikibooks 上阅读有关计算表达式的更多信息:http ://en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions
如果你想深入了解这背后的理论,你可以阅读 Tomas Petricek 和 Don Syme 的这篇论文:http: //www.cl.cam.ac.uk/~tp322/drafts/notations.pdf