我已经发布了很多关于 Scala 中的故障处理的问题,我真的感谢大家的回答。
我理解在处理 Either 和 Scalaz 或 a 时的选择,以便理解,我还有另一个(最后一个?)问题:
当操作处理外部非功能世界(例如数据库)时,如何执行快速失败的操作序列?
我的意思是我有这样的方法:
def insertItem(item: Item): Either[Error,Item]
感谢 Either 和这些答案,我知道如何使用 Either 来做到这一点:使用 Either 链接方法调用 https://stackoverflow.com/questions/12107272/chaining-method-calls-with-either and
Scala 中的方法参数验证,带有理解和 monad https://stackoverflow.com/questions/12307965/method-parameters-validation-in-scala-with-for-comprehension-and-monads
But my Item
case 类是不可变的,将其作为Right
因为调用者已经拥有该值。
因此,我怎样才能做同样的事情:
def insertItem(item: Item): Option[Error]
在我的应用程序中,当创建用户时,我们还为他创建一些项目。
如果一个项目创建失败,那么整个过程应该停止。
当我直接使用时Option[Error]
在理解中,我认为我不会得到我期望的结果。
我想这样做是有意义的:
for {
_ <- insertItem(item1).toLeft("???").right
_ <- insertItem(item2).toLeft("???").right
_ <- insertItem(item3).toLeft("???").right
}
但作为值“???”我投入的权利从来没有用,我想我错过了一个优雅的解决方案,该解决方案不涉及创建永远不会使用的权利。
我想我正在寻找只有当结果是时才会继续理解的东西None
,这有点奇怪,因为我只想继续下一个操作,而不是做真正的操作map
手术。
顺便说一句,如果可能的话,我想要非 Scalaz 和 Scalaz 解决方案。
我不确定 Scalaz 是否能处理此类事情,因为它似乎更专注于真正的函数式编程,并且可能不提供像我的用例这样的副作用行为的代码?