我正在尝试使用 Scala 2.11.7 编译以下代码。
object LucasSeq {
val fibo: Stream[Int] = 0 #:: 1 #:: fibo.zip(fibo.tail).map { pair =>
pair._1 + pair._2
}
def firstKind(p: Int, q: Int): Stream[Int] = {
val lucas: Stream[Int] = 0 #:: 1 #:: lucas.zip(lucas.tail).map { pair =>
p * pair._2 - q * pair._1
}
lucas
}
}
fibo
基于ScalaStream
文档中的 Fibonacci 序列示例,并且可以正常工作。
然而,firstKind
试图用参数p
和q
(使卢卡斯序列成为第一类)泛化序列的函数有以下错误:
LucasSeq.scala:7: error: forward reference extends over definition of value lucas
val lucas: Stream[Int] = 0 #:: 1 #:: lucas.zip(lucas.tail).map { pair =>
^
one error found
基本上是一样的代码,那为什么它在函数外工作,而在函数内却不行呢?
这个错误信息让我之前的许多程序员感到困惑。我考虑过……</p>
- 所以不要把那个代码放在一个函数中——但我确实想要一个函数。
implicit val lucas
——没用。- 自引用只能用在惰性表达式中——但这是惰性的,对吧?
-Xprint:typer
使用诊断进行编译——不确定如何处理这些信息。- 是阴影问题吗?— 不,我正在使用不冲突的标识符。
- 编译器错误?- 我希望不是。引用的错误应该已经在 2.11.7 中修复。
我可能会继续阅读几个小时,但我认为此时最好寻求帮助。我正在寻找解决方案和解释。(我熟悉函数式编程,但对 Scala 不熟悉,所以如果解释涉及“综合”和“隐式”等术语,那么我可能还需要对此进行额外解释。)