斯卡拉流一个人

Bil*_*ton 1 scala map stream

有人可以解释一下REPL的以下输出吗?

我正在定义2个(无限)流,否则它们的定义相同,只是前面有地图.一个定义中的(句点)和另一个定义中的_ _(空格).

我可以看到这会导致map绑定不同,但是第二个定义的输出中的1会发生什么?

谢谢.

scala> lazy val infinite: Stream[Int] = 1 #:: infinite.map(_+1)
infinite: Stream[Int] = <lazy>

scala> val l = infinite.take(10).toList.mkString(",")
l: String = 1,2,3,4,5,6,7,8,9,10

scala> lazy val infinite2: Stream[Int] = 1 #:: infinite2 map(_+1)
infinite2: Stream[Int] = <lazy>

scala> val l2 = infinite2.take(10).toList.mkString(",")
l2: String = 2,3,4,5,6,7,8,9,10,11
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 11

这是关于方法关联性的.这个:

1 #:: infinite.map(_+1)
Run Code Online (Sandbox Code Playgroud)

这很简单:

1 #:: infinite2 map(_+1)
Run Code Online (Sandbox Code Playgroud)

由编译器解释为:

(1 #:: infinite2) map(_+1)
Run Code Online (Sandbox Code Playgroud)

1 #:: infinite2是您想要的流,但在您返回之前,您应用延迟转换,为每个项添加一个.这就解释了为什么1从来没有出现作为一个结果-转型成为后2.

有关更多详细信息,请参阅:Scala中的运算符优先级.由于#不是特殊字符,因此对其进行同等对待map,因此从左到右对方法进行评估.