scala - for之后如何避免平面图

标签 scala scala-cats

我有以下代码片段:

(for {
  _ <- LiveUserQuery.make(DbManager.failRollback).create(user)
  - <- IO.sleep(2.seconds)
  a <- router.run(Request(GET, uri"/user/d85ec250-bb5c-11ea-b3de-0242ac130030")).value
} yield a).flatMap {
  case Some(req) =>
    req.as[User].map { u =>
      val is_uuid_valid = u.id.compareTo(UUID.fromString("d85ec250-bb5c-11ea-b3de-0242ac130030")) == 0
      expect(is_uuid_valid) && expect(u.gender == "F")
    }
  case None => expect(false)
}

并想避免 for 之后的 flatMap。如何将代码块从flatMap 移动到for

最佳答案

类似于 Matthias 但使用 fold 代替。

for {
  _ <- LiveUserQuery.make(DbManager.failRollback).create(user)
  - <- IO.sleep(2.seconds)
  a <- router.run(Request(GET, uri"/user/d85ec250-bb5c-11ea-b3de-0242ac130030")).value
  result <- a.fold(ifEmpty = expect(false)) { req =>
    req.as[User].map { u =>
      val is_uuid_valid = u.id.compareTo(UUID.fromString("d85ec250-bb5c-11ea-b3de-0242ac130030")) == 0
      expect(is_uuid_valid) && expect(u.gender == "F")
    }
  }
} yield result

关于scala - for之后如何避免平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62704794/

相关文章:

scala - 你会如何用猫包装一个包含并发 HashMap 的类?

scala - 不同的单子(monad)用于理解

c - Scala 中是否有 getch() 的等价物?

scala - 如何使用shapeless在scala中实现[x] -> x?

scala - 如何使用 Scala Guice 绑定(bind)一个扩展具有 monadic 类型参数的 Trait 的类?

scala - Semigroup和SemigroupK之间的区别

java - 在并发编程方面,Scala 比 Java 有什么优势?

Scala泛型类型约束

scala - 归还单位有错吗?

scala - Option[F[ShoppingCart]] 到 F[Option[ShoppingCart]] 之间的转换