J'essaierai moi-même. J'accepterai volontiers une meilleure réponse de Travis Brown ou Miles Sabin.
Nat ne peut actuellement pas être utilisé pour représenter de grands nombres
Dans l'implémentation actuelle de Nat, la valeur correspond au nombre de types imbriqués sans forme.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Donc, pour représenter le nombre 1000000, vous auriez un type imbriqué à 1000000 niveaux de profondeur, ce qui ferait certainement exploser le compilateur scala. La limite actuelle semble être d'environ 400 à partir de l'expérimentation, mais pour des temps de compilation raisonnables, il serait probablement préférable de rester en dessous de 50.
Cependant, il existe un moyen d'encoder de grands entiers ou d'autres valeurs au niveau du type, à condition que vous ne souhaitiez pas effectuer de calculs sur eux . La seule chose que vous pouvez faire avec ceux-ci pour autant que je sache, c'est de vérifier s'ils sont égaux ou non. Voir ci-dessous.
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]
^
Cela pourrait être utilisé par exemple pour appliquer la même taille de tableau lors d'opérations sur les bits sur Array [Byte].