Я пытаюсь скомпилировать следующий код, используя 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
основан на примере последовательности Фибоначчи в Stream
Scala. документации, и это работает.
Однако функция 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
По сути, это один и тот же код, так почему же он работает вне функции, но не внутри функции?
Это сообщение об ошибке озадачило многих программистов до меня. Я рассмотрел…
- Поэтому просто не помещайте этот код в функцию — но мне нужна функция.
implicit val lucas
— не помогает.- Ссылки на себя можно использовать только в ленивых выражениях — но это лениво, верно?
- Компилировать с
-Xprint:typer
диагностикой — не знаю, что делать с этой информацией. - Это проблема теневого копирования? — Нет, я использую идентификаторы, которые не конфликтуют.
- Ошибка компилятора? — надеюсь, что нет. Указанная ошибка уже должна быть исправлена в версии 2.11.7.
Я, вероятно, мог бы продолжать читать часами, но я думаю, что сейчас лучше обратиться за помощью. Я ищу и решение, и объяснение. (Я знаком с функциональным программированием, но новичок в Scala, поэтому, если объяснение включает такие термины, как «синтетический» и «неявный», то мне, вероятно, потребуется дополнительное объяснение и этого.)