在 F# 中,使用 FsToolkit.ErrorHandling 进行验证计算表达式时,“and!” 是什么?

5

当使用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
        }
< p > and!的含义是什么?看起来let!被映射到Result.bind,但我没有看到let!and!之间有任何不同的行为。

据我所见,用let!替换and!会保持相同的行为。

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

1个回答

5

这是在F# 5.0中引入的支持"应用计算表达式"的新特性。

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

例如,使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接