【问题标题】:Is there a standard option workflow in F#?F# 中是否有标准选项工作流程?
【发布时间】:2011-10-19 08:06:05
【问题描述】:

标准 F# 库中是否有选项(可能)wokflow (monad)?

我已经找到了这个工作流程的十几个手工实现(12),但我并不想在我的项目中引入非标准且不太受信任的代码。对 google 和 msdn 的所有可以想象的查询都让我不知道在哪里可以找到它。

【问题讨论】:

    标签: f# workflow option monads maybe


    【解决方案1】:

    没有用于选项的标准计算构建器,但是如果您不需要诸如惰性之类的东西(如您链接的示例中所添加的那样),则代码很简单,没有理由不信任它(特别是考虑到暗示性命名 @标准库中的 987654321@ 函数)。这是一个相当简单的例子:

    type OptionBuilder() =
        member x.Bind(v,f) = Option.bind f v
        member x.Return v = Some v
        member x.ReturnFrom o = o
        member x.Zero () = None
    
    let opt = OptionBuilder()
    

    【讨论】:

    • 我发现在此添加Zero 方法很有用:member x.Zero () = None。这允许构建器的以下用法:let thisIsNone = opt { if 2 + 2 = 5 then return "The impossible has happened" }
    【解决方案2】:

    标准 F# 库中没有 Maybe monad。你可能想看看FSharpx,这是一个由 F# 社区的高素质成员编写的 F# 扩展,它有很多有用的 monad。

    【讨论】:

      【解决方案3】:

      我在 nuget 上创建了一个开源库 FSharp.Interop.NullOptAble

      它不仅可以用作选项工作流,还可以用作 null 或可为 null 的工作流。

      let x = Nullable(3)
      let y = Nullable(3)
      option {
          let! x' = x
          let! y' = y
          return (x' + y')
      } (* |> should equal (Some 6) *)
      

      效果一样好

      let x = Some(3)
      let y = Some(3)
      option {
          let! x' = x
          let! y' = y
          return (x' + y')
      } (* |> should equal (Some 6) *)
      

      甚至

      let x = "Hello "
      let y = "World"
      option {
          let! x' = x
          let! y' = y
          return (x' + y')
      } (* |> should equal (Some "Hello World") *)
      

      如果是nullNone

      let x = "Hello "
      let y:string = null
      option {
          let! x' = x
          let! y' = y
          return (x' + y')
      } (* |> should equal None *)
      

      最后,如果你有很多可空类型的东西,我有一个chooseSeq {} 的 cexpr,如果你有一个 yield! 的东西 null/None 它就不会产生。

      查看更多示例here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多