29

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

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

4

3 回答 3

24

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

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()
于 2011-10-19T14:43:02.937 回答
17

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

于 2011-10-19T08:13:58.503 回答
1

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

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

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 *)

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

在此处查看更多示例。

于 2018-04-29T18:45:42.093 回答