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 = Pure
。 Pure[x] >: IO[x]
不正确...
它是如何工作的?
So emits returns a 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
.
我正在试验 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 = Pure
。 Pure[x] >: IO[x]
不正确...
它是如何工作的?
So emits returns a 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
.