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)
使以下调用有效