Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的类型推断。在这种情况下它是如何工作的?_Scala_Functional Programming_Type Inference - Fatal编程技术网

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

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]?签

我正在体验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[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

  • 因此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


  • 但是
    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]
    的隐式转换?我希望它不那么有用,尽管我对此没有强烈的意见。