Scala 中的类型推断。在这种情况下它是如何工作的?

Type inference in Scala. How does it work in this case?

我正在试验 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]

所以 fs2.Stream[IO, Int]emits returns a fs2.Stream[Pure, Int], but flatMap 想要 F2[x] >: F[x]F = IO,但是 F2 = PurePure[x] >: IO[x] 不正确...

它是如何工作的?

So emits returns a 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. Femits的签名被推断为IO.