Я пытаюсь скомпилировать следующий код, используя Scala 2.11.7.Ошибка Scala: «forward reference extends over definition of value», когда код появляется в функции
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
основан на Fibonacci sequence example in Scala's Stream
documentation, и она работает.
Однако функция firstKind
, которая пытается обобщить последовательность с параметрами p
и q
(изготовление Lucas sequences of the first kind), имеет следующую ошибку:
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
Это в основном тот же самый код, так почему она работает вне функция, но не внутри функции?
Это сообщение об ошибке озадачило многих программистов передо мной. Я считал ...
- So just don't put that code in a function - но я сделать хотите функцию.
implicit val lucas
- не помогает.- Self-references can only be used in lazy expressions - но этот is ленивый, не так ли?
- Compile with
-Xprint:typer
diagnostics - не уверен, что делать с этой информацией. - Is it a shadowing issue? - Нет, я использую идентификаторы, которые не сталкиваются.
- Compiler bug? - Надеюсь, что нет. Исправленная ошибка должна быть уже исправлена в 2.11.7.
Возможно, я продолжал читать часами, но я думаю, что было бы лучше попросить помощи на этом этапе. Я ищу и решение, и объяснение. (Я знаком с функциональным программированием, но новым для Scala, поэтому, если объяснение включает термины типа «синтетический» и «неявный», то мне, вероятно, также понадобится дополнительное объяснение этого.)
«Компиляция с -Xprint: диагностика typer - не уверен, что делать с этой информацией». Пожалуйста, вставьте это здесь. – Jus12
@ Jus12 Есть много смысла в вставке вывода? Любой, у кого есть компилятор Scala, может воспроизвести его, компилируя приведенный выше код. –