在Scala中键入推断。在这种情况下如何运作?

时间:2018-08-25 19:10:18

标签: scala functional-programming type-inference

我正在尝试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 = PurePure[x] >: IO[x]不正确...

它如何工作?

1 个答案:

答案 0 :(得分:2)

  

So发射返回一个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签名中的
  4. emitsIO