scalaz.Validation
被认为比Try
单子更强大,因为它可以累积错误。
是否有任何情况下您可能会选择Try
而不是scalaz.Validation
或scalaz.\/
?
scalaz.Validation
被认为比Try
单子更强大,因为它可以累积错误。
是否有任何情况下您可能会选择Try
而不是scalaz.Validation
或scalaz.\/
?
Try
最重要的优点是它在标准库中。它也在标准库中被使用——例如您使用 Future
的 onComplete
注册回调函数时必须使用 Try
。未来它可能在标准库中得到更广泛的应用。\/
的时候没有将 Throwable
放在其左侧(我偶尔会这样做)。 Try
将此内置,因此您无需担心编写别名或其他内容。
正如senia在上面的评论中提到的,将类似于“either”的类型进行偏置,但仍使用“左”和“右”的语言(如\/
)可能有点不直观。为什么\/
会绑定到右侧?因为它就是这样。我个人并不觉得命名有什么问题,但我可以理解为什么有些人会这样认为。Try
通过具有清晰表示其语义的构造函数名称(Success
和Failure
而不是Left
和Right
或-\/
和\/-
)来避免这个问题。
现在我们来谈一下完全表面和主观的使用Try
的原因,有些人可能只是觉得\/
和-\/
和\/-
很丑陋。我通常不介意操作符重载的代码,并且我发现斜杠和短横线的混乱非常难以输入和阅读。
那么这些是支持使用Try
的一些论点,正如所请求的那样。但我要总结一下,说我自己从不使用它。虽然我可以理解人们为什么会这样想,但我并不特别关心它违反了单子律。相比之下,我发现\/
和Validation
更少是临时性的,更容易推理,而且我喜欢在一个框架中同时使用它们(Validation
当我想要累积错误时,\/
当我需要单子序列时)。
Validation
中没有flatMap
,而\/
也不是一个语义上正确的工具。但这只是我的观点,不是对你问题的回答。 - senia\/
有什么问题吗? - Travis Brownleft
和right
之间不应该有区别。我无法向同事解释为什么\/
能够按照它现在的方式工作,“没有逻辑,只需要记住它”并不是一个解释。 - senia