【问题标题】:Int Option instead of Int in F#Int 选项而不是 F# 中的 Int
【发布时间】:2013-10-08 06:05:13
【问题描述】:

我遇到以下问题:

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 类型。

难道我打算使用safeDivSome(4)Some(2)?这也不起作用...

【问题讨论】:

    标签: f# int option f#-interactive


    【解决方案1】:

    好吧,这有点矫枉过正,但我​​最近确实做了类似的事情。

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

    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 -> float -> float option

    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

    【讨论】:

      【解决方案2】:

      你的第二个版本很接近。

      应该是

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          问题在于 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
          

          【讨论】:

            猜你喜欢
            • 2013-01-26
            • 2011-01-11
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-07
            相关资源
            最近更新 更多