我正在调查chessie库。我经常看到正在使用Trial.lift和Trial.bind函数。如果我理解正确,Trial.lift接受一个函数参数并执行并返回该函数,如果管道中的结果是成功的。如果这是真的,那么Trial.bind不会做同样的事情吗?
答案 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#环境进行测试。