Intentaré uno yo mismo. Con mucho gusto aceptaré una mejor respuesta de Travis Brown o Miles Sabin.
Nat no se puede usar actualmente para representar grandes números
En la implementación actual de Nat, el valor corresponde al número de tipos anidados sin forma.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Por lo tanto, para representar el número 1000000, tendría un tipo anidado con niveles de 1000000 de profundidad, lo que definitivamente haría explotar el compilador de scala. El límite actual parece ser de aproximadamente 400 por experimentación, pero para tiempos de compilación razonables probablemente sería mejor mantenerse por debajo de 50.
Sin embargo, hay una manera de codificar enteros grandes u otros valores a nivel de tipo, siempre que no desee hacer cálculos sobre ellos . Hasta donde yo sé, lo único que puede hacer es comprobar si son iguales o no. Vea abajo.
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]
^
Esto podría usarse, por ejemplo, para imponer el mismo tamaño de matriz cuando se realizan operaciones de bits en Array [Byte].