我正在尝试fs2.Stream
,并且遇到了有关类型推断的误解。假设我们有以下代码:
import cats.effect.IO
val ios = IO(List(1, 2, 3))
val s: fs2.Stream[IO, Int] = fs2.Stream.eval(ios).flatMap(l =>
fs2.Stream.emits(l)
) //compiles OK, but why?
它编译良好。但是我不明白为什么类型是fs2.Stream[IO, Int]
?这是签名:
def flatMap[F2[x] >: F[x], O2](f: O => Stream[F2, O2]): Stream[F2, O2] // F = IO?
def emits[F[x] >: Pure[x], O](os: Seq[O]): Stream[F, O]
因此emits
返回一个fs2.Stream[Pure, Int]
,但是fs2.Stream[IO, Int]
中的flatMap
想要F2[x] >: F[x]
,其中F = IO
,但是F2 = Pure
。 Pure[x] >: IO[x]
不正确...
它如何工作?
答案 0 :(得分:2)
So发射返回一个fs2.Stream [Pure,Int]
不,不是。
给出了s
的期望类型,l => fs2.Stream.emits(l)
的期望类型是List[Int] => fs2.Stream[IO, Int]
,所以
fs2.Stream.emits(l)
的预期类型为fs2.Stream[IO, Int]
,所以
F
签名中的 emits
为IO
。