Vou tentar um eu mesmo. Terei prazer em aceitar uma resposta melhor de Travis Brown ou Miles Sabin.
O Nat atualmente não pode ser usado para representar grandes números
Na implementação atual do Nat, o valor corresponde ao número de tipos aninhados sem forma.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Portanto, para representar o número 1000000, você teria um tipo aninhado em 1000000 níveis de profundidade, o que definitivamente explodiria o compilador scala. O limite atual parece ser cerca de 400 da experimentação, mas por tempos razoáveis de compilação provavelmente seria melhor ficar abaixo de 50.
No entanto, existe uma maneira de codificar números inteiros grandes ou outros valores no nível do tipo, desde que você não queira fazer cálculos sobre eles . A única coisa que você pode fazer com as pessoas que eu saiba é verificar se elas são iguais ou não. Ver abaixo.
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]
^
Isso pode ser usado para, por exemplo, impor o mesmo tamanho de matriz ao realizar operações de bits na matriz [Byte].