Scala中的错误处理单子?Try vs Validation

20

scalaz.Validation被认为比Try单子更强大,因为它可以累积错误。

是否有任何情况下您可能会选择Try而不是scalaz.Validationscalaz.\/


Validation中没有flatMap,而\/也不是一个语义上正确的工具。但这只是我的观点,不是对你问题的回答。 - senia
\/有什么问题吗? - Travis Brown
@TravisBrown:对称性leftright之间不应该有区别。我无法向同事解释为什么\/能够按照它现在的方式工作,“没有逻辑,只需要记住它”并不是一个解释。 - senia
1
@mpilquist: 是的,这样做并不令人满意。给不对称类型(good/bad)取对称名称(left/right)是没有道理的。 - senia
1个回答

33
Try 最重要的优点是它在标准库中。它也在标准库中被使用——例如您使用 FutureonComplete 注册回调函数时必须使用 Try。未来它可能在标准库中得到更广泛的应用。
它在标准库中的事实也意味着更多人会熟悉它。您可能会发现自己在使用的第三方库中经常看到它。当然,有时您可能不允许使用 Scalaz(或其他任何依赖关系),或者出于其他非常好的原因而希望避免使用 Scalaz。
其他内容:我已经记不清上一次写 \/ 的时候没有将 Throwable 放在其左侧(我偶尔会这样做)。 Try 将此内置,因此您无需担心编写别名或其他内容。

正如senia在上面的评论中提到的,将类似于“either”的类型进行偏置,但仍使用“左”和“右”的语言(如\/)可能有点不直观。为什么\/会绑定到右侧?因为它就是这样。我个人并不觉得命名有什么问题,但我可以理解为什么有些人会这样认为。Try通过具有清晰表示其语义的构造函数名称(SuccessFailure而不是LeftRight-\/\/-)来避免这个问题。

现在我们来谈一下完全表面和主观的使用Try的原因,有些人可能只是觉得\/-\/\/-很丑陋。我通常不介意操作符重载的代码,并且我发现斜杠和短横线的混乱非常难以输入和阅读。

那么这些是支持使用Try的一些论点,正如所请求的那样。但我要总结一下,说我自己从不使用它。虽然我可以理解人们为什么会这样想,但我并不特别关心它违反了单子律。相比之下,我发现\/Validation更少是临时性的,更容易推理,而且我喜欢在一个框架中同时使用它们(Validation当我想要累积错误时,\/当我需要单子序列时)。


“left”和“right”的问题是什么?“right”可以表示“正确”的意思。这是一个双关语,难道这么难理解吗?Scalaz在去除这个双关语时让事情变得混乱了,这就是问题所在。 - user239558
3
好的,这让我感到困惑......“Try”是一种捕获异常并将其转化为值的方法,它是一个专门的“Either [Exception,T]”。而“Validation”似乎没有以任何方式处理异常,所以在我看来,它们彼此之间相当独立。 - Daniel C. Sobral
拉丁形容词sinister/sinistra/sinistrum最初是指“左”,但在古典拉丁时代演变成了“邪恶”或“不幸”的意义,这种双重含义在拉丁语的欧洲衍生词和英语单词“sinister”中仍然存在。 https://en.wikipedia.org/wiki/Bias_against_left-handed_people https://en.wikipedia.org/wiki/Dexter_and_sinister - rapt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接