I\'m kinda new to Scala trying it out while reading Beggining Scala by David Pollack. He defines a simple recursive function that loads all strings from the file:
It's not tail recursive (and can't ever be) because the final operation is not a recursive call to allStrings
, it's a call to the ::
method.
The safest way to resolve this is with a nested method that uses an accumulator:
def allStrings(expr: => String) = {
@tailrec
def inner(expr: => String, acc: List[String]): List[String] = expr match {
case null => acc
case w => inner(expr, w :: acc)
}
inner(expr, Nil)
}
In this particular case, you could also lift the accumulator to a parameter on allStrings
, give it a default value of Nil
, and avoid the need for an inner method. But that's not always possible, and it can't be called nicely from Java code if you're concerned about interop.