我傻吗?有些东西在 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 背景,这些背景基本上是后者)。
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,可能是上述之一。