F#中的Int选项代替Int#

时间:2013-10-08 06:05:14

标签: f# int option f#-interactive

我遇到以下问题:

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)吗?这不起作用......

4 个答案:

答案 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