Validation 在Scala中处理单子时出错?尝试与验证

Validation 在Scala中处理单子时出错?尝试与验证,validation,scala,error-handling,monads,scalaz,Validation,Scala,Error Handling,Monads,Scalaz,scalaz.Validation据说比Trymonad更强大,因为它可以累积错误 在任何情况下,您可能会选择Try而不是scalaz.Validation或scalaz.\/?支持Try的最重要论据是它在标准库中。它还用于标准库中,例如,在Future的onComplete中注册的回调必须是Try中的函数。将来,它可能会在标准库中得到更广泛的使用 它在标准库中的事实也意味着它将被更多的人所熟悉。您可能会在更多使用的第三方库中找到它。当然,有时您可能不允许使用Scalaz(或任何其他依赖项),或

scalaz.Validation
据说比
Try
monad更强大,因为它可以累积错误


在任何情况下,您可能会选择
Try
而不是
scalaz.Validation
scalaz.\/

支持
Try
的最重要论据是它在标准库中。它还用于标准库中,例如,在
Future
onComplete
中注册的回调必须是
Try
中的函数。将来,它可能会在标准库中得到更广泛的使用

它在标准库中的事实也意味着它将被更多的人所熟悉。您可能会在更多使用的第三方库中找到它。当然,有时您可能不允许使用Scalaz(或任何其他依赖项),或者出于其他非常好的原因,您可能希望避免使用Scalaz

其他东西:我不记得上次我写了一个
\/
,它的左侧没有
可丢弃的
(我有,这只是我不经常做的事情)
Try
将其烘焙,因此您不必担心编写别名或其他任何东西

正如上面评论中所指出的,偏向一个类似的类型,但仍然使用“left”和“right”的语言(正如
\/
是,并且确实是)可能有点不直观。为什么
\/
通过右侧绑定?这就是为什么。我个人并不觉得这个名字令人反感,但我能理解为什么有些人会这么说
Try
通过使用明确表示其语义的构造函数名称来避免问题:
成功
失败
,而不是
-\/
\/-

现在,我们使用
Try
的原因完全是肤浅和主观的,有些人可能会认为
\/
-\/
\/-
是丑陋的。我通常不介意运算符繁重的代码,而且我发现斜杠和破折号的混乱很难打字和阅读


因此,这些都是支持“按要求尝试”,但最后我会说我自己从来没有使用过它。我并不特别关心这一事实(虽然我能理解人们为什么这么做),但我确实发现
\/
验证
没有那么特别,更容易推理,我喜欢两者都可以使用(
验证
\/
)在单个框架中。

验证中没有
flatMap
,在语义不正确的工具中也没有
\/
。但这只是我的意见,不是你问题的答案。
\/
有什么问题?@TravisBrown:。
左侧
右侧
之间应该没有区别。我无法向我的同事解释为什么
\/
是这样工作的,“没有逻辑,只要记住它”不是一个解释。@mpilquist:是的,这不令人满意。没有理由为非对称类型(
good/bad
)指定对称名称(
left/right
)。左和右有什么问题?右==正确。这是一个双关语,这是一件令人困惑的事情吗?Scalaz在删除双关语时混淆了问题,这就是问题所在。好吧,这让我感到困惑
Try
是捕获异常并将其转换为值的东西,是一种专门的
或[Exception,T]
<代码>验证
似乎不会以任何方式处理异常,因此,在我看来,它们彼此非常正交。拉丁形容词sinister/sinistra/sinistrum最初的意思是“左”,但在古典拉丁语时代具有“邪恶”或“不幸”的含义,这种双重含义在拉丁语的欧洲派生词中仍然存在,英语单词“sinister”。