【发布时间】:2012-08-19 21:24:55
【问题描述】:
我想知道是否可以创建某种“方法调用链”,所有方法都返回相同的 Either[Error,Result]。
我要做的是:依次调用所有方法,当方法返回Left(Error)时,停止方法调用并返回调用链中找到的第一个Left。
我尝试了一些东西,包括折叠、地图、投影……但我是 Scala 新手,找不到任何优雅的解决方案。
我尝试过这样的事情:
def createUserAndMandatoryCategories(user: User) : Either[Error,User] = {
User.create(user).right.map {
Logger.info("User created")
Category.create( Category.buildRootCategory(user) ).right.map {
Logger.info("Root category created")
Category.create( Category.buildInboxCategory(user) ).right.map {
Logger.info("Inbox category created")
Category.create( Category.buildPeopleCategory(user) ).right.map {
Logger.info("People category created")
Category.create( Category.buildTrashCategory(user) ).right.map {
Logger.info("Trash category created")
Logger.info("All categories successfully created created")
Right(user)
}
}
}
}
}
}
但它不起作用。 无论如何,我真的不喜欢它需要的缩进。 此外,我想将错误转换为描述问题的新字符串(我想我应该使用折叠?)
我正在寻找这样写的东西:
val result : Either[String,CallResult] = call1.something("error 1 description")
.call2.something("error 2 description")
.call3.something("error 3 description")
.call4.something("error 4 description")
Scala 可以做这样的事情吗?也许同时使用 Either 和 Option?
还有一个限制是,如果第一次调用失败,则不应进行其他调用。我不想要一个我调用所有东西然后加入其中一个的解决方案。
谢谢!
【问题讨论】:
-
嗨,你正在寻找来自 scalaz 的特征验证
-
这是 Either monad 的描述。
标签: scala functional-programming monads either