Я как бы новичок в Scala, пробуя его, читая Beggining Scala Дэвида Поллака. Он определяет простую рекурсивную функцию, которая загружает все строки из файла:
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] =
Я неправильно понимаю хвостовую рекурсию? Как мне исправить этот код?