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