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

标签 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,失败,成功]。这些返回类型是必需的,因为这些方法与外部服务交互(下线)。

有什么方法可以将 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/

相关文章:

json - Play Json 中的验证错误(路径丢失)

scala - Scala play 框架中的表单

scala - scala中的 "not a simple type"警告是什么意思?

python - 在 Python 中,部分函数应用(柯里化(Currying))与显式函数定义

scala - 如何展平析取类型

scala - 如果是 scala.Ordering,这个 case 有什么用?

scala - 是否有一个与 Scala 的 JavaConverters 等效且不使用 Wrappers 的 Scala 库(即开源)?

haskell - 如何使用 Scott 编码表示嵌套类型?

javascript - react : How to supply callback arrow functions to stateless functional child components?

scala - 类型别名与 lambda 类型