Я экспериментирую с 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]
, но flatMap
из fs2.Stream[IO, Int]
хочет F2[x] >: F[x]
, где F = IO
, но F2 = Pure
. Pure[x] >: IO[x]
не правильно ...
Как это работает?