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

Jam*_*abe 20 validation error-handling monads scala scalaz

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

是否有任何情况下,您可以选择Tryscalaz.Validationscalaz.\/

Tra*_*own 33

支持的最重要的论点Try是它在标准库中.它也使用标准库,例如您注册回调FutureonComplete必须是从功能Try.它可能在将来更广泛地用于标准库中.

它在标准库中的事实也意味着它对于更多人来说看起来很熟悉.您可能倾向于在更多使用的第三方库中找到它.当然,有时您可能不允许使用Scalaz(或任何其他依赖项),或者可能希望避免使用Scalaz以获得其他完美的理由.

其他的东西:我记不起上次我写了一个\/没有Throwable左侧的东西(我有 - 这不是我经常做的事情).Try把它加入,所以你不必担心写别名或其他什么.

正如Senia在上面的评论中指出的那样,对于偏向类似的类型但仍然使用"左"和"右"的语言(按原样\/,并且确实如此),可以说有点不直观.为什么要\/通过右侧绑定?因为它确实如此,这就是原因.我个人并没有发现令人反感的命名,但我可以理解为什么有些人会这样做.Try具有构造函数的名称清楚地表明它们的语义避免了这个问题:SuccessFailure,不LeftRight-\/\/-.

现在,我们正在向完全肤浅和主观原因使用Try,有些人可能只是想\/-\/\/-丑陋.我一般不介意操作员繁重的代码,而且我发现混乱的斜线和破折号真的令人不快打字和阅读.

因此Try,根据要求,这些是赞成的一些论据,但我最后会说,我自己从不使用它.我并没有特别关心它违反了monad法则这一事实(虽然我能理解为什么人们会这样做),但我确实发现\/并且Validation更不用说特别且更容易推理,我喜欢访问两者(Validation 当我希望积累的错误,\/ 当我需要一元排序)在一个单一的框架.

  • 好吧,这让我感到困惑......"尝试"是捕获异常并将它们变成值的东西,一种专门的"要么[异常,T]"."验证"似乎不会以任何方式处理异常,因此,对我来说,它们看起来彼此非常正交. (3认同)