我有一个简单的代码:
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返回存储库列表和贡献列表。但是现在我需要为createContributorsList
找到的每个存储库调用createReposList
。我已经完成了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
的每个存储库并在每个人身上调用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
返回Unit
,所以您不需要的是。