Stream-cons #:: 如何翻译成 Scala



我目前正在通过阅读"Programming in Scala"一书来学习Scala。到目前为止,对于所有看起来很奇怪的事情(从Java程序员的角度来看),已经有很好的解释,但是这个使用Stream生成斐波那契数列的例子让我有点困惑:

def fibFrom(a: Int, b: Int): Stream[Int] =
  a #:: fibFrom(b, a + b)

溪流的建设是如何完成的?当然,#::运营商对此负有某种责任。我知道,由于它以 : 结尾,它是右关联的,但这并不能解释流的创建。我想它以某种方式隐式地转换为构造函数,但我不明白为什么以及如何确切。

我已经在Predef.scalaLowPriorityImplicits.scala中寻找答案,但到目前为止没有运气。

谁能开导我?

它是右关联,因此它可以用作右参数的方法:

fibFrom(b, a + b).#::(a)

至少这是它试图在语法上做的事情。 Stream[Int]没有这样的方法。幸运的是,object Stream隐式地指向具有此方法(代码)的某些类ConsWrapper

因此,隐式解析后得到的是:

immutable.this.Stream.consWrapper(fibFrom(b, a + b)).#::(a)

流类似于列表。它只知道它的头部和流的其余部分:Stream(head:T,tail:Stream[T])。不同之处在于,流是延迟计算的。方法名称末尾的":"表示该方法是正确的关联。因此,表达式 a #:: fibFrom(b, a + b) 被(由编译器)转换为 fibFrom(b, a + b).#::(a)。

最新更新