我目前正在通过“Scala编程”书籍学习Scala。到目前为止,已经有一切看起来怪异的(从Java程序员的角度来看)很好的解释,但使用流生成斐波那契序列是其中一个例子让我有种困惑:Stream-cons#::如何在Scala中翻译?
def fibFrom(a: Int, b: Int): Stream[Int] =
a #:: fibFrom(b, a + b)
如何建设流的完成?当然,#::
运营商对此负有责任。我明白,因为它在:
结束,它是正确关联,但这并不解释流的创建。我猜它是以某种方式隐式转换为构造函数,但我不明白为什么以及如何。
我已经在Predef.scala
和LowPriorityImplicits.scala
寻找答案,但到目前为止还没有运气。
任何人都可以启发我吗?
谢谢,就是这样。我忘记了隐式转换也可以在应该转换的类的伴随对象中定义。 – rolve
Scaladoc应该可能会自动包含那些硬编码的伴随含义。 – Debilski
也许向其他人指出,Scala并不认为它是正确联合的。这也是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)'只会在访问时被调用。 – nicerobot