F# Int选项而不是F中的Int#

F# Int选项而不是F中的Int#,f#,int,option,f#-interactive,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 safeDiv 4 2 我得到以下错误 此表达式应具有int类型选项,但此处具有int类型 是不是我要用safeDiv(代码)一些

我遇到以下问题:

let safeDiv x y = 
  match (x,y) with
  | (_, Some 0) -> None
  | (Some xx, Some yy) -> Some (xx/yy)
  | _ -> None
当我在Visual Studio的交互窗口中运行此简单函数时,如下所示:

safeDiv 4 2
safeDiv 4 2
我得到以下错误

此表达式应具有int类型选项,但此处具有int类型


是不是我要用safeDiv(代码)一些(4)
一些(2)
?这也不起作用…

您的第二个版本很接近

应该是

safeDiv (Some(4)) (Some(2))

需要额外的括号,以确保以正确的顺序应用函数。

您的第二个版本已接近尾声

应该是

safeDiv (Some(4)) (Some(2))

需要额外的括号来确保函数按正确的顺序应用。

您构建的函数具有签名
safeDiv:int option->int option->int option->int option
。您需要使用类似于
safeDiv(大约4个)(大约2个)
的条目来按原样使用您的函数。

您构建了一个具有签名的函数
safeDiv:int option->int option->int option
。您需要使用类似于safeDiv(大约4个)(大约2个)的条目才能按原样使用您的函数。

好的,这太过分了,但我最近确实做了类似的事情

首先,我为选项类型定义了一个计算表达式生成器:

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 option类型的函数子

let sub x y = if y = 0.0 then None else Some (x / y)
let safeDiv x y = opt { let! a = x
                        let! b = y
                        return! sub a b }
最后,我使用OptionBuilder将saveDiv定义为float option->float option->float option

let sub x y = if y = 0.0 then None else Some (x / y)
let safeDiv x y = opt { let! a = x
                        let! b = y
                        return! sub a b }
您可以在wikibooks上阅读有关计算表达式的更多信息:


如果你想深入研究这背后的理论,你可以阅读托马斯·佩特里切克和唐·赛姆的这篇论文:

好吧,这太过分了,但我最近确实做了类似的事情

首先,我为选项类型定义了一个计算表达式生成器:

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 option类型的函数子

let sub x y = if y = 0.0 then None else Some (x / y)
let safeDiv x y = opt { let! a = x
                        let! b = y
                        return! sub a b }
最后,我使用OptionBuilder将saveDiv定义为float option->float option->float option

let sub x y = if y = 0.0 then None else Some (x / y)
let safeDiv x y = opt { let! a = x
                        let! b = y
                        return! sub a b }
您可以在wikibooks上阅读有关计算表达式的更多信息:


如果你想深入研究这背后的理论,你可以阅读Tomas Petricek和Don Syme的这篇文章:

问题在于int*int类型的(4,2)与表达式(_,一些0)和(一些xx,一些yy)的匹配。整个功能可以简化:

let safeDiv x y = 
    match (x,y) with
    | (_, 0) -> None
    | (_, _) -> Some (x/y)
使以下调用有效


问题在于int*int类型的(4,2)与表达式(u,一些0)和(一些xx,一些yy)的匹配。整个功能可以简化:

let safeDiv x y = 
    match (x,y) with
    | (_, 0) -> None
    | (_, _) -> Some (x/y)
使以下调用有效