首页 > 解决方案 > 什么是“和!” 在 FsToolkit.ErrorHandling 的验证计算表达式中,在 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
        }

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

据我所见,它看起来像替换and!保持相同的行为。

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

标签: f#computation-expression

解决方案


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

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

推荐阅读