F# 中 FsToolkit.ErrorHandling 的验证计算表达式中的 'and!' 是什么

what is 'and!' in the validation computation expression with FsToolkit.ErrorHandling, in F#

使用 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
        }

和!是什么意思?看起来 let! 映射到 Result.bind,但我没有看到 let! 和 [=21] 之间的不同行为=]和!

据我所知,用 let! 替换 and! 似乎保持相同的行为。

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

这是 F# 5.0 中引入的对 "applicative computation expressions" 的新支持。

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

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

let! a = Ok 3
let! b = Ok (2 * a)   // Allowed: value of b depends on a

但是你不能这样写:

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