F#中是否有标准选项工作流程?

时间:2011-10-19 08:06:06

标签: f# workflow option monads maybe

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

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

3 个答案:

答案 0 :(得分:17)

对于选项没有标准的计算构建器,但是如果你不需要懒惰之类的东西(如你链接的例子中所添加的那样)代码很简单,没有理由没有信任它(特别是考虑到标准库中具有暗示性命名的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()

答案 1 :(得分:16)

标准F#库中没有可能的monad。您可能希望查看FSharpx,这是由F#社区的高素质成员编写的F#扩展,其中包含许多有用的monad。

答案 2 :(得分:0)

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

它不仅可以作为选项工作流程使用,而且还可以作为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