Sam spróbuję. Chętnie przyjmuję lepszą odpowiedź od Travisa Browna lub Milesa Sabina.
Obecnie nie można używać funkcji Nat do reprezentowania dużych liczb
W obecnej implementacji Nat, wartość odpowiada liczbie zagnieżdżonych typów shapeless.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Tak więc, aby przedstawić liczbę 1000000, miałbyś typ zagnieżdżony na głębokości 1000000 poziomów, co zdecydowanie wysadziłoby kompilator scala. Obecny limit wydaje się wynosić około 400 z eksperymentów, ale dla rozsądnych czasów kompilacji prawdopodobnie najlepiej byłoby pozostać poniżej 50.
Istnieje jednak sposób kodowania dużych liczb całkowitych lub innych wartości na poziomie typu, pod warunkiem, że nie chcesz wykonywać na nich obliczeń . O ile wiem, jedyne, co możesz z nimi zrobić, to sprawdzić, czy są równe, czy nie. Zobacz poniżej.
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]
^
Można to wykorzystać np. Do wymuszenia tego samego rozmiaru tablicy podczas wykonywania operacji bitowych na Array [Byte].