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

use*_*180 5 f#

我正在寻找国际象棋图书馆.我经常看到正在使用Trial.lift和Trial.bind函数.如果我理解正确,Trial.lift接受一个函数参数并执行并返回该函数,如果管道中的结果是成功的.如果这是真的,那么Trial.bind不会做同样的事情吗?

Fyo*_*kin 10

这些函数略有不同:在bind函数下,函数f必须返回a 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
Run Code Online (Sandbox Code Playgroud)

同时lift将"普通"功能世界中的特定功能"传输"到功能世界中Result<_>:

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

古老的Scott Wlaschin发表了一篇非常好的文章,以一种非常好的和可理解的方式谈论这些事情:高架世界.我最喜欢的文章之一.
(这里有一个关于bind)

PS对不起,如果你在上面的例子中发现了小错误 - 我现在没有可用的F#环境进行测试.