在chessie错误处理中Trial.lift和Trial.bind有什么区别?

时间:2017-07-13 00:24:29

标签: f#

我正在调查chessie库。我经常看到正在使用Trial.lift和Trial.bind函数。如果我理解正确,Trial.lift接受一个函数参数并执行并返回该函数,如果管道中的结果是成功的。如果这是真的,那么Trial.bind不会做同样的事情吗?

1 个答案:

答案 0 :(得分:9)

这些功能略有不同:在bind下,函数f必须返回Result<_>,而lift则需要任何普通函数。

可以这样想:bind“将”另一个可能失败的计算附加到前一个计算链:

let isOdd x = if x % 2 = 0 then ok x else fail "Even!"
let x = ok 5
let oddX = x |> bind isOdd

lift将“普通”函数世界中的给定函数“传输”到Result<_>函数的世界中:

let plus5 x = x + 5  // plus5 : int -> int
let liftedPlus5 = lift plus5  // lisftedPlus5 : Result<int,_> -> Result<int,_>
let seven = liftedPlus5 (ok 2)

古老的Scott Wlaschin写了一篇非常好的文章,以一种非常好的和可理解的方式谈论这些事情:Elevated World。我最喜欢的一篇文章。
here是关于bind

的一个

P.S。很抱歉,如果您在上面的示例中发现了一些小错误 - 我现在没有可用的F#环境进行测试。