F# 有没有选择<&燃气轮机;计算表达式在哪里?

F# 有没有选择<&燃气轮机;计算表达式在哪里?,f#,F#,我是不是很愚蠢? 有些东西在monad/计算表达式中看起来更好,我有很多代码使用seq计算表达式,但是每次我点击一个选项,我就必须返回到“option.map”等等 有点刺耳(当我在C#中做这件事时,我为IMaybe类型编写了一个linq操作符,它看起来很好并且一致) 我可以,但我不是特别想写一个,一定有一个(或多个),人们用哪一个 i、 e 所以而不是 let postCodeMaybe = personMaybe |> Option.bind (fun p ->

我是不是很愚蠢? 有些东西在monad/计算表达式中看起来更好,我有很多代码使用seq计算表达式,但是每次我点击一个选项,我就必须返回到“option.map”等等

有点刺耳(当我在C#中做这件事时,我为IMaybe类型编写了一个linq操作符,它看起来很好并且一致)

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

i、 e

所以而不是

let postCodeMaybe = 
    personMaybe 
    |> Option.bind (fun p -> p.AddressMaybe())
    |> Option.map (fun -> p.Postcode())
我们可以走了

let postCodeMaybe = 
    option {
        for p in personMaybe do
            for a in p.AddressMaybe() do
                 a.Postcode()
    }

我对前一段代码没有任何问题,只是在我的上下文中,它存在于许多类似于后一段的“seq”计算表达式中(一些研究这段代码的开发人员将来自C#/LINQ背景,基本上就是后一种).

FSharp.Core中没有
选项
CE,但它存在于某些库中

我认为FSharp.Core中没有提供许多CE的原因之一是,有许多不同的方法可以实现它们,如果你在谷歌上搜索一个选项计算表达式生成器,你会发现有些是严格的,有些是懒惰的,有些支持副作用,有些支持将多个返回值混合到一个中

关于库,在
中有一个名为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 }
让x:option=option{
让!p=personMaybe
让!a=p.AddressMaybe()
返回a}

其中,
选项
是您的选项生成器,可以是上面提到的选项之一。

我们使用FsToolkit.ErrorHandling。它简单,维护积极,运行良好

它具有选项、结果、结果选项、验证、异步结果、异步结果选项的CEs


如果您可以共享一段特定的代码,可能会更容易理解您所问的问题。我已经修改了这个问题