Stream-cons#::如何在Scala中翻译?

rol*_*lve 7 scala

我目前正在通过"Scala编程"一书来学习Scala.到目前为止,对于所有看起来很奇怪的东西(从Java程序员的角度来看)都有很好的解释,但是这个使用Stream生成Fibonacci序列的例子让我感到有些困惑:

def fibFrom(a: Int, b: Int): Stream[Int] =
  a #:: fibFrom(b, a + b)
Run Code Online (Sandbox Code Playgroud)

如何完成Stream的构建?当然,#::运营商对此负有某种责任.我理解,因为它结束了:,它是右关联的,但这并不能解释Stream的创建.我猜它是以某种方式隐式转换为构造函数,但我不明白为什么以及如何确切.

我已经找到了答案Predef.scala,LowPriorityImplicits.scala但到目前为止还没有运气.

任何人都可以开导我吗?

Deb*_*ski 8

它是正确的关联,所以它作为右参数的方法:

fibFrom(b, a + b).#::(a)
Run Code Online (Sandbox Code Playgroud)

至少这是它试图在语法上做的事情.Stream[Int]没有这样的方法.幸运的是,object Stream有一个隐含的某个类ConsWrapper有这个方法(代码).

那么,隐式解决后你得到的是:

immutable.this.Stream.consWrapper(fibFrom(b, a + b)).#::(a)
Run Code Online (Sandbox Code Playgroud)

  • Scaladoc应该自动包含那些硬编码的伴随暗示. (5认同)
  • 也许向Scala的新人指出,它不是_just_它是正确联想的.这也是ConsWrapper将`#::'实现为[call-by-name](https://github.com/scala/scala/blob/v2.10.3/src/library/scala/collection/immutable/Stream.斯卡拉#L1042).即``ConsWrapper(tl:⇒Stream[A])中的`⇒`,以便翻译成`immutable.this.Stream.consWrapper(fibFrom(b,a + b)).#::( a)`表示只有在访问时才会调用`fibFrom(b,a + b)`. (2认同)