在standrd F#库中是否有选项(可能)wokflow(monad)?
我已经找到了这个工作流程的十几个手工制作的实现(1,2),但我真的不想将非标准和非常受信任的代码引入我的项目。谷歌和msdn的所有可想象的查询都不知道在哪里找到它。
答案 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") *)
如果有null
或None
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。