I'm kinda new to Scala trying it out while reading Beggining Scala by David Pollack. Он определяет простую рекурсивную функцию, которая загружает все строки из файла:
def allStrings(expr: => String): List[String] = expr match {
case null => Nil
case w => w :: allStrings(expr)
}
Это элегантно и потрясающе, за исключением того, что оно вызывало исключение StackOverflow, когда я пытался загрузить огромный файл словаря.
Теперь, насколько я понимаю, Scala поддерживает хвостовая рекурсия, так что вызов функции не может переполнить стек, возможно, компилятор не распознает его? Итак, после некоторого поиска в Google я попробовал аннотацию @tailrec, чтобы помочь компилятору, но там было сказано
error: could not optimize @tailrec annotated method: it contains a recursive call not in tail position
def allStrings(expr: => String): List[String] =
Я неправильно понимаю хвостовую рекурсию? Как мне исправить этот код?