我正在调查 chessie图书馆。我经常看到 Trial.lift 和 Trial.bind 函数被使用。如果我理解正确, Trial.lift 接受一个函数参数,如果管道输入的结果成功,则执行并返回该函数。如果这是真的,难道 Trial.bind 不会做同样的事情吗?
最佳答案
这些功能略有不同:在 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
的一个)附言抱歉,如果您在上面的示例中发现了小错误 - 我现在没有一个可用的 F# 环境来测试。
关于f# - Trial.lift 和 Trial.bind 在 chessie 错误处理中的区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45069568/