任何地方都有 option<> 计算表达式吗?

Mr *_*r D 5 f#

我傻吗?有些东西在 monad/计算表达式中看起来更好,我有很多使用 seq 计算表达式的代码,但是每次我点击一个选项<>我都必须恢复到“Option.map”等。

有点刺耳(当我在 C# 中执行此操作时,我为 IMaybe<> 类型编写了一个 linq 运算符,它看起来不错且一致)。

我可以,但不是特别想写一个,那里肯定有一个(或多个),人们使用哪个?

IE

所以而不是

let postCodeMaybe = 
    personMaybe 
    |> Option.bind (fun p -> p.AddressMaybe())
    |> Option.map (fun -> p.Postcode())
Run Code Online (Sandbox Code Playgroud)

我们可以去

let postCodeMaybe = 
    option {
        for p in personMaybe do
            for a in p.AddressMaybe() do
                 a.Postcode()
    }
Run Code Online (Sandbox Code Playgroud)

我对前面的代码没有任何问题,除了在我的上下文中它存在于许多看起来像后者的“seq”计算表达式中(并且一些将查看此代码的开发人员将来自 C#/LINQ 背景,这些背景基本上是后者)。

Gus*_*Gus 6

FSharp.Core 中没有optionCE,但在某些库中存在。

我认为 FSharp.Core 中没有提供许多 CE 的原因之一是因为有很多不同的方法来实现它们,如果你在 google 上搜索选项计算表达式生成器,你会发现有些是严格的,有些是懒惰的,有些是支持方面的-其他效果支持将多个返回值混合为一个。

关于库, F#x中有一个称为F#+maybe ,它提供通用计算表达式,因此您可以使用 Linq 之类的东西,只要类型实现 CE 就可以使用的某些方法,您可以使用或如果您更喜欢允许多个返回值的版本。let x:option<_> = monad' { ... let x:option<_> = monad.plus' { ...

您的代码将如下所示:

let x: option<_> = option {
   let! p = personMaybe
   let! a = p.AddressMaybe()
   return a 
}
Run Code Online (Sandbox Code Playgroud)

您的选项构建器在哪里option,可能是上述之一。