Scala中的类型推断。在这种情况下它是如何工作的?
我正在体验fs2.Stream,遇到了一些关于类型推断的误解。假设我们有以下代码:Scala中的类型推断。在这种情况下它是如何工作的?,scala,functional-programming,type-inference,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]?签
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[Pure,Int]
,但是fs2.Stream[IO,Int]
想要F2[x]>:F[x]
其中F=IO
,但是F2=Pure
<代码>纯[x]>:IO[x]不正确
它是如何工作的
因此emits返回一个fs2.Stream[Pure,Int]
不,没有
s
,预期类型的l=>fs2.Stream.emits(l)
是List[Int]=>fs2.Stream[IO,Int]
,因此fs2.Stream.emits(l)
的预期类型是fs2.Stream[IO,Int]
,因此emits
签名中的F
被推断为IO
s
,预期类型的l=>fs2.Stream.emits(l)
是List[Int]=>fs2.Stream[IO,Int]
,因此fs2.Stream.emits(l)
的预期类型是fs2.Stream[IO,Int]
,因此emits
签名中的F
被推断为IO
但是
emits
签名中的约束F[x]>:Pure[x]
如何<代码>IO[x]>:纯[x]?是的,因为键入纯[A]啊,现在我明白了,谢谢。但在我看来,这似乎有点牵强。正如文档中指定的那样,表示流不会评估任何影响Id[A]
似乎也适合这个目的……并添加从Id[A]
到F[A]
的隐式转换?我希望它的可用性会降低,尽管我对此没有强烈的意见。但是F[x]>:Pure[x]
在emits
签名中的约束如何<代码>IO[x]>:纯[x]
?是的,因为键入纯[A]啊,现在我明白了,谢谢。但在我看来,这似乎有点牵强。正如文档中指定的那样,表示流不会评估任何影响Id[A]
似乎也适合这个目的……并添加从Id[A]
到F[A]
的隐式转换?我希望它不那么有用,尽管我对此没有强烈的意见。