f# - Trial.lift 和 Trial.bind 在 chessie 错误处理中的区别是什么?

标签 f#

我正在调查 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/

相关文章:

c# - Reflection.Emit 不安全代码

F# 将空值传递给非托管导入的 DLL

c# - 如何在 C# 中创建 F# 匿名记录?

f# - 为什么 $ 允许但 $$ 或 <$> 不允许作为运算符 (FS0035) 以及 $ 的特殊之处?

f# - 将数组提供给 printfn

f# - 即使我只在一个模块中调用一个函数,为什么我的所有函数都在运行?

.net - 带有值的字典的环境变量列表 - 惯用的 F#

c# - 在 C# 中模拟 F# `with` 关键字

visual-studio-2010 - 在 Visual Studio 2010 中以 x64 平台为目标时,F# 项目引用不起作用

asp.net-mvc - F# 中具有可选参数的 MVC Controller