FS2 join无法证明Seq [fs2.Stream [cats.effect.IO,Int]]<:< fs2.Stream [cats.effect.IO,O2]

时间:2018-01-03 18:40:53

标签: scala scala-cats scalaz-stream fs2

我正在尝试使用fs2流0.10.0-M9和doobie版本0.5.0-M9来获取http调用中的一系列对象,我想将其插入到postgres数据库但我遇到了问题构造此代码,得到以下错误:

  

错误:(49,12)无法证明Seq [fs2.Stream [cats.effect.IO,Int]]   <:其中fs2.Stream [cats.effect.IO,O2]。         。加入(100)

我想要做的是在调用Web服务返回后同时运行insert语句。这是代码:

fetchProducts(date).map{items  =>
        items.map( i =>
          Stream.eval(upsertProductIO(i).transact(xa))
        )
      }
      .join(100)
      .run
      .unsafeRunSync()

//rest call
def fetchProducts(changeDate: String): Stream[IO, Seq[Product]] = {
//rest call here
}

//DAO code
def upsertProductIO(p: Product): ConnectionIO[Int] = {
  upsertProduct(p).run
}

1 个答案:

答案 0 :(得分:2)

问题是您有Seq[Stream[IO, Seq[Product]],您想要的是Stream[IO, Seq[Product]],您可以使用Foldable类型类实例执行此操作:

import cats.implicits._
import scala.concurrent.ExecutionContext.Implicits.global

fetchProducts(date).map { items =>
   items.map(i => Stream.eval(upsertProductIO(i).transact(xa)))
}.map(seqOfStream.toList.sequence)
 .join(100)
 .run
 .unsafeRunSync()