什么是“和!” 在 F# 中使用 FsToolkit.ErrorHandling 的验证计算表达式中

Tho*_*mas 5 f# computation-expression

使用 FsToolkit.ErrorHandling 并查看此示例时:

testCase "Happy Path Result" <| fun () ->
        let actual : Validation<int, string> = validation {
            let! a = Ok 3
            and! b = Ok 2
            and! c = Ok 1
            return a + b - c
        }
Run Code Online (Sandbox Code Playgroud)

和是什么意思?看起来就像让!被映射到 Result.bind,但我没有看到let! 之间有不同的行为!

据我所知,它看起来像是替换并且!让!保持相同的行为。

我刚刚开始涉足计算表达式,事情开始有意义,尽管我不太明白为什么 F# 关键字(如 let )和实际函数(如 bind)之间有不同的命名法,因此它增加了一层混乱。所以这个问题的答案可能是显而易见的:)

bri*_*rns 5

这是F# 5.0 中引入的对“应用计算表达式”的新支持。

let!和之间的区别and!在于,let!允许值依赖于先前的结果,而and!不允许。这对于您的计算是应用程序而不是完整的 monad 的情况很有用,或者当您想要在计算中并行执行独立步骤时。

例如,let!你可以这样写:

let! a = Ok 3
let! b = Ok (2 * a)   // Allowed: value of b depends on a
Run Code Online (Sandbox Code Playgroud)

但你不能这样写:

let! a = Ok 3
and! b = Ok (2 * a)   // Not allowed: value of b depends on a
Run Code Online (Sandbox Code Playgroud)