Ne proverò uno io stesso. Accetterò volentieri una risposta migliore da Travis Brown o Miles Sabin.
Nat attualmente può non essere utilizzato per rappresentare grandi numeri
Nell'attuale implementazione di Nat, il valore corrisponde al numero di tipi annidati informi.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Quindi, per rappresentare il numero 1000000, avresti un tipo che è annidato a 1000000 livelli di profondità, che farebbe sicuramente saltare il compilatore scala. Il limite attuale sembra essere di circa 400 dalla sperimentazione, ma per tempi di compilazione ragionevoli sarebbe probabilmente meglio rimanere al di sotto di 50.
Tuttavia, esiste un modo per codificare interi di grandi dimensioni o altri valori a livello di tipo, a condizione che non si desideri eseguire calcoli su di essi . L'unica cosa che puoi fare con quelli per quanto ne so è verificare se sono uguali o meno. Vedi sotto.
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]
^
Questo potrebbe essere usato, ad esempio, per applicare la stessa dimensione di array quando si eseguono operazioni di bit su Array [byte].