Подтвердить что ты не робот

Почему функции scala ограничены 22 параметрами?

Не то, чтобы я действительно приблизился к этому пределу, но я всегда задавался вопросом: почему они останавливаются на Function22/Tuple22. Ограничение JVM? Произвольный выбор?

4b9b3361

Ответ 1

Функции и кортежи переписываются как объекты компилятором и определяются только Function0 через Function22 и Tuple0 через Tuple22. Я думаю, что предел 22 полностью произволен, но причина наличия предела не является.

Подумайте об этом так: для запуска приложения Scala должны присутствовать классы, необходимые для его запуска. Если компилятор будет динамически создавать классы для функций, то эти классы не будут включены в библиотеку JAR Scala, поэтому вам придется включить их в свое приложение. Это может сработать, но тогда у вас возникнет проблема с тем, что должны быть имена полностью квалифицированных классов: если бы они были одинаковыми для всех приложений, тогда у вас были бы конфликты, поскольку библиотеки содержали бы одни и те же классы, и если имена не были бы то же, что и в конечном итоге с несовместимостью - функции из библиотек не будут такими же, как функции в вашем приложении.

Ответ 2

Нет такого предела. Даже если стандартные библиотеки определяют только до Function22, вы можете определить Function23, если вам это нужно, вплоть до предела JVM. Или вы можете группировать аргументы в кортежи. Или вы можете просто перестать притворяться, что любая функция принимает более одного аргумента:

a => b => c => d => e => ...

Curried функции могут принимать как можно больше аргументов.

Ответ 3

В основном это произвольно, но существуют некоторые основные ограничения на JVM, которые диктуют примерно то, что нужно для ограничения.

Основная проблема - сопоставление шаблонов в классах классов. Если класс case позволил быть намного большим, то сгенерированный код соответствия шаблону мог бы очень легко превысить максимальный допустимый размер метода. Все остальное (Product, Function, Tuple,...) просто следует за 22-параметрическим пределом, который был выбран для классов case.

Также... Если вы пишете функции/кортежи с параметрами > 22, то вы, вероятно, просрочены для редизайна:)

Ответ 4

Произвольный выбор. Хотя эти классы автоматически генерируются, где-то должен быть предел.

Обратите внимание, что вы можете иметь что-то вроде "кортежей произвольного размера" с помощью HLists или подобных конструкций (см. http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html)