Разве этот код не в хвостовом рекурсивном стиле?

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] =

Я неправильно понимаю хвостовую рекурсию? Как мне исправить этот код?

45
задан om-nom-nom 1 July 2012 в 19:16
поделиться