如何从for-comprehension中删除折叠?

时间:2015-09-17 19:22:22

标签: scala functional-programming scalaz

我使用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, Failure, Success]。这些返回类型是必需的,因为这些方法与外部服务交互(下线)。

有没有办法将理解的最后一行简化为更好的东西?我是说这个:

result <- aamEith.fold(err => Task.now(-\/(err)), aam => process(aam)).run)

1 个答案:

答案 0 :(得分:3)

我可能会立即将结果从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)

这是未经测试的,但类似的东西应该或多或少有效。