Я спробую один. Я з радістю прийму кращу відповідь від Тревіса Брауна або Майлза Сабіна.
Nat зараз не можна використовувати для представлення великої кількості
У поточній реалізації Nat, значення відповідає кількості вкладених безформних типів.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]
^
Це може бути використано, наприклад, для застосування одного розміру масиву під час виконання бітових операцій над масивом [байт].