我遇到以下问题:
let safeDiv x y =
match (x,y) with
| (_, Some 0) -> None
| (Some xx, Some yy) -> Some (xx/yy)
| _ -> None
当我在Visual Studio的交互式窗口中运行这个简单的函数时,如下所示:
safeDiv 4 2
我收到以下错误...
这个表达式应该有int类型选项,但这里有int类型。
可能是我打算使用safeDiv
Some(4)
Some(2)
吗?这不起作用......
答案 0 :(得分:3)
好的,这太过分了,但我最近做了类似的事情。
首先,我为选项类型定义了计算表达式构建器:
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类型的函数sub - >浮动 - >浮动选项
let sub x y = if y = 0.0 then None else Some (x / y)
最后我使用OptionBuilder将saveDiv定义为float选项 - >浮动选项 - >浮动选项
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
答案 1 :(得分:1)
你的第二个版本已经结束了。
应该是
safeDiv (Some(4)) (Some(2))
需要额外的括号以确保以正确的顺序应用功能。
答案 2 :(得分:1)
您构建了一个具有签名safeDiv : int option -> int option -> int option
的函数。您需要使用safeDiv (Some 4) (Some 2)
之类的条目来按原样使用您的功能。
答案 3 :(得分:0)
问题在于类型为int * int的(4,2)与表达式(_,Some 0)和(Some xx,Some yy)的匹配。整个功能可以简化:
let safeDiv x y =
match (x,y) with
| (_, 0) -> None
| (_, _) -> Some (x/y)
使以下呼叫有效
safeDiv 4 2