В бесформенном типе Nat представлен способ кодирования натуральных чисел на уровне типа. Это используется, например, для списков фиксированного размера. Вы даже можете выполнять вычисления на уровне типа, например, добавлять список N
элементов в список K
элементов и возвращать список, который, как известно, во время компиляции имеет N+K
элементы.
Способно ли это представление представлять большие числа, например, 1000000
или 2 53 , или это заставит компилятор Scala сдаться?
scala
numbers
compiler-optimization
shapeless
Рюдигер Клаен
источник
источник
Ответы:
Я попробую один сам. Я с удовольствием приму лучший ответ от Трэвиса Брауна или Майлза Сабина.
Nat может в настоящее время не используется для представления больших чисел
В текущей реализации Nat значение соответствует количеству вложенных типов shapeless.Succ []:
Таким образом, чтобы представить число 1000000, вы должны иметь тип с вложенной глубиной 1000000 уровней, который определенно взорвет компилятор scala. Текущий предел, по-видимому, составляет около 400 от экспериментов, но для разумного времени компиляции, вероятно, было бы лучше остаться ниже 50.
Однако есть способ кодировать большие целые числа или другие значения на уровне типа, при условии, что вы не хотите выполнять вычисления на них . Насколько мне известно, единственное, что вы можете сделать с ними, это проверить, равны они или нет. Увидеть ниже.
Это может быть использовано, например, для обеспечения того же размера массива при выполнении битовых операций над массивом [байт].
источник
ops.nat.Sum
которые будут свидетельствовать о том, что два целых числа уровня типа имеют определенную сумму и т. Д. (Они просто должны быть предоставлены макросом).Concat
класса типов, который позволяет объединить две строки уровня типа через макрос. Класс типов для суммирования целых чисел на уровне типов, вероятно, будет выглядеть очень похоже.Shapeless's
Nat
кодирует натуральные числа на уровне типа, используя кодировку Черча. Альтернативный метод заключается в представлении натуральных чисел в виде HList уровня битов.Посмотрите плотную, которая реализует это решение в бесформенном стиле.
Я не работал над этим в течение некоторого времени, и он нуждается в небольшом количестве
Lazy
капель, когда скалак сдается, но концепция тверда :)источник