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