Scala - 如何在理解块中使用 foreach 循环?

Scala - how to use foreach loop in for comprehension block?

我有一个简单的代码:

 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)

此代码 return 来自 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 我怎么能做到这一点,因为我在这里像 IO 一样在 Monads 上操作。我应该如何创建一个代码来遍历 repos 中的每个 repo 并在每个人身上调用 stats.createContributorsList

尝试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 所以这不是你需要的。