Почему Scala не оптимизирует хвостовой вызов с помощью try / catch?

В недавний ответ StackOverflow , я дал следующий рекурсивный код:

def retry[T](n: Int)(fn: => T): T = {
  try {
    fn
  } catch {
    case e if n > 1 =>
      retry(n - 1)(fn)
  }
}

Если я добавлю аннотацию @tailrec , я получу:

Не удалось оптимизировать аннотированный @tailrec повторение метода: он содержит рекурсивный вызов не в хвостовой позиции.

Мне удалось взломать альтернативу с хвостовой рекурсией, но я все еще удивляюсь, почему она не оптимизировалась. Почему бы и нет?

17
задан Community 23 May 2017 в 12:24
поделиться