f#中有标准的选项工作流吗?



在标准f#库中是否有一个选项(可能)工作流(monad) ?

我已经找到了一打这种工作流的手工实现(1,2),但我真的不想在我的项目中引入非标准的和不太可信的代码。所有我能想到的搜索google和msdn都不知道在哪里找到它

没有用于选项的标准计算构建器,但如果您不需要惰性(如您链接的示例中添加的)之类的东西,则代码足够简单,没有理由不相信它(特别是考虑到标准库中暗示命名的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()

在标准f#库中没有Maybe单子。你可能想看看FSharpx,一个由f#社区的高素质成员编写的f#扩展,它有相当多的有用的单子。

我已经在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它只是没有得到产出。

最新更新