我在使用 Scalaz 和 Task/EitherT 的 Scala 中有以下代码片段:
def myMethod(request: MyRequest) : EitherT[Task, Failure, Success] =
EitherT[Task, Failure, Success](
for {
aamOpt <- async.findUser(request)
aamEith <- Task.now(aamOpt.\/>(NoUserFound()))
result <- aamEith.fold(err => Task.now(-\/(err)), aam => process(aam)).run)
} yield result)
async.findUser
返回一个 Task[Option[MyUser]]
而 process(aam)
返回 EitherT[Task,失败,成功]
。这些返回类型是必需的,因为这些方法与外部服务交互(下线)。
有什么方法可以将 for comprehension 的最后一行简化为更好的东西吗?我是说这个:
result <- aamEith.fold(err => Task.now(-\/(err)), aam => process(aam)).run)
最佳答案
我可能会立即将 async.findUser
的结果提升到相关的 EitherT
monad 中,然后只是 flatMap
:
def myMethod(request: MyRequest): EitherT[Task, Failure, Success] =
EitherT.eitherT[Task, Failure, MyUser](
async.findUser(request).map(_.\/>(NoUserFound()))
).flatMap(process)
这是未经测试的,但类似的东西应该或多或少起作用。
关于scala - 如何从 for-comprehension 中删除折叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32638395/