当前位置: 首页 > 知识库问答 >
问题:

在Scala中处理monads时出错?尝试与验证

邵劲
2023-03-14

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

有没有什么场合你可能会选择< code>Try而不是< code>scalaz。验证或< code>scalaz。\/?

共有1个答案

明越
2023-03-14

支持<code>Try</code>的最重要论点是它在标准库中。它还用于标准库中,例如,您在FutureonComplete中注册的回调函数必须是Try。它可能在未来的标准库中得到更广泛的使用。

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

其他东西:我不记得上次我写一个左边没有< code>Throwable的< code>\/是什么时候了(我有——只是我不经常这么做)。< code>Try将此功能嵌入其中,因此您不必担心编写别名或其他任何内容。

正如senia在上面的评论中指出的那样,偏向一个类似于两者之一的类型,但仍然使用“左”和“右”的语言(正如< code>\/所做的那样),这可能有点不直观。为什么< code>\/通过右侧绑定?因为确实如此,这就是原因。我个人并不觉得这种命名有什么不妥,但我可以理解为什么有些人会有异议。< code>Try通过让构造函数名清楚地指示它们的语义来避免这个问题:< code>Success和< code>Failure,而不是< code>Left和< code>Right或< code>-\/和< code>\/-。

既然我们已经找到了使用try的完全肤浅和主观的原因,有些人可能只是认为\/-\/\/-很难看。我通常不介意操作员繁重的代码,我发现输入和阅读混杂的斜线和破折号真的很不愉快。

因此,这些是一些支持尝试的论据,根据要求,但我最后要说的是,我自己从不使用它。我并不特别关心它违反了monad定律的事实(尽管我可以理解为什么人们会这样做),但我确实发现\/Verify不那么临时,更容易推理,我喜欢在单个框架中访问两者(当我想累积错误时进行验证,当我需要一元测序时)。

 类似资料: