Основное ограничение заключается просто в том, что JVM не предоставляет хвостовые вызовы в своем байтовом коде, и, следовательно, у языка, построенного на JVM, нет прямого способа предоставить хвостовые вызовы. Существуют обходные пути, которые могут достичь аналогичного эффекта (например, прыжок на батуте), но они обходятся очень дорого за счет ужасной производительности и запутывания сгенерированного промежуточного кода, что делает отладчик бесполезным.
Таким образом, JVM не может поддерживать какие-либо функциональные языки программирования производственного качества, пока Sun не реализует хвостовые вызовы в самой JVM. Они обсуждали это в течение многих лет, но я сомневаюсь, что они когда-либо будут реализовывать хвостовые вызовы: это будет очень сложно, потому что они преждевременно оптимизировали свою виртуальную машину, прежде чем реализовывать такую базовую функциональность, а усилия Sun сильно сосредоточены на динамических языках, а не на функциональных языках.
Следовательно, есть очень веский аргумент в пользу того, что Scala не является настоящим языком функционального программирования: эти языки считали хвостовые вызовы важной функцией с тех пор, как Scheme был впервые представлен более 30 лет назад.