【问题标题】:Scala - how to use foreach loop in for comprehension block?Scala - 如何在理解块中使用 foreach 循环?
【发布时间】:2019-11-10 21:25:59
【问题描述】:

我有一个简单的代码:

 override def createContributorsList(url: String, params: String): F[List[Contributor]] = getContributorsFromClient(url, params).fold[List[Contributor]](_ => List(), res => res)

 override def createReposList(organization: String, params: String): F[List[GitRepository]] = getReposFromClient(organization, params).fold[List[GitRepository]](_ => List(), res => res)

此代码返回来自 github 的存储库列表和贡献列表。但是现在我需要为createReposList 找到的每个存储库调用createContributorsList。我做了一个for comprehension 块:

val stats = new StatisticsRepository[IO](new GitHttpClient[IO])
val res = for {
    repos <- stats.createReposList("github", "")
  } yield repos

它工作正常,它找到了给定组织 (github) 的存储库。所以我试着这样做:

val res = for {
    repos <- stats.createReposList("github", "")
    list = repos.foreach(repo => stats.createContributorsList(repo.contributors_url, ""))
  } yield (repos, list)

list 始终为空。我不知道没有for comprehension 我怎么能做到这一点,因为我在Monads 上操作,就像IO 一样。我应该如何创建一个代码来遍历来自 repos 的每个 repo 并在每个人身上调用 stats.createContributorsList

【问题讨论】:

    标签: scala scala-cats for-comprehension


    【解决方案1】:

    试试flatTraverse

    import cats.syntax.flatMap._
    import cats.syntax.functor._
    import cats.syntax.traverse._
    import cats.instances.list._
    
    val res: F[(List[GitRepository], List[Contributor])] = for {
      repos <- stats.createReposList("github", "")
      list <- repos.flatTraverse(repo => stats.createContributorsList(repo.contributors_url, ""))
    } yield (repos, list)
    

    foreach return Unit 所以这不是你需要的。

    【讨论】:

    • 是否可以返回简单的 `List[Contributor]` 而不是 F[...]?问题是当我想运行它时,我总是需要使用unsafeRunSync 来获取列表。或者我如何从F[A] 获得A
    • 你不应该想从F[A] 得到A。一旦你进入 monad,你就会继续使用 monad。这对于所有 monad(Option、Future、IO ......)都很常见。例如,像for { a &lt;- ... : F[A]; ... 这样的for-compehensions 通常你会在最后运行一次unsafeRunSync
    • list inside list &lt;- repos.flatTraverse... 的类型为 List[Contributor]
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2020-08-26
    • 2015-07-04
    • 2019-11-21
    • 2023-03-27
    • 2015-05-04
    • 2019-07-18
    相关资源
    最近更新 更多