Введите вывод в Scala.Как это работает в этом случае? - PullRequest
0 голосов
/ 25 августа 2018

Я экспериментирую с 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] не правильно ...

Как это работает?

1 Ответ

0 голосов
/ 25 августа 2018

Так что emits возвращает fs2.Stream [Pure, Int]

Нет, это не так.

  1. Учитывая ожидаемый тип s, ожидаемый тип l => fs2.Stream.emits(l) равен List[Int] => fs2.Stream[IO, Int], поэтому

  2. ожидаемый тип fs2.Stream.emits(l) равен fs2.Stream[IO, Int], поэтому

  3. F в подписи emits подразумевается как IO.

...