Я попробую один сам. Я с удовольствием приму лучший ответ от Трэвиса Брауна или Майлза Сабина.
Nat может в настоящее время не используется для представления больших чисел
В текущей реализации Nat значение соответствует количеству вложенных типов shapeless.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Таким образом, чтобы представить число 1000000, вы должны иметь тип с вложенной глубиной 1000000 уровней, который определенно взорвет компилятор scala. Текущий предел, по-видимому, составляет около 400 от экспериментов, но для разумного времени компиляции, вероятно, было бы лучше остаться ниже 50.
Однако есть способ кодировать большие целые числа или другие значения на уровне типа, при условии, что вы не хотите выполнять вычисления на них . Насколько мне известно, единственное, что вы можете сделать с ними, это проверить, равны они или нет. Увидеть ниже.
scala> type OneMillion = Witness.`1000000`.T
defined type alias OneMillion
scala> type AlsoOneMillion = Witness.`1000000`.T
defined type alias AlsoOneMillion
scala> type OneMillionAndOne = Witness.`1000001`.T
defined type alias OneMillionAndOne
scala> implicitly[OneMillion =:= AlsoOneMillion]
res0: =:=[OneMillion,AlsoOneMillion] = <function1>
scala> implicitly[OneMillion =:= OneMillionAndOne]
<console>:16: error: Cannot prove that OneMillion =:= OneMillionAndOne.
implicitly[OneMillion =:= OneMillionAndOne]
^
Это может быть использовано, например, для обеспечения того же размера массива при выполнении битовых операций над массивом [байт].