我使用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)
答案 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)
这是未经测试的,但类似的东西应该或多或少有效。