Saya akan mencoba satu sendiri. Saya dengan senang hati akan menerima jawaban yang lebih baik dari Travis Brown atau Miles Sabin.
Nat saat ini tidak bisa dapat digunakan untuk mewakili jumlah besar
Dalam implementasi Nat saat ini, nilainya sesuai dengan jumlah tipe nested tak berbentuk. Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Jadi untuk mewakili angka 1000000, Anda akan memiliki tipe yang bersarang level 1000000, yang pasti akan meledakkan kompiler scala. Batas saat ini tampaknya sekitar 400 dari percobaan, tetapi untuk waktu kompilasi yang masuk akal mungkin akan lebih baik untuk tetap di bawah 50.
Namun, ada cara untuk menyandikan bilangan bulat besar atau nilai lain di tingkat tipe, asalkan Anda tidak ingin melakukan perhitungan pada mereka . Satu-satunya hal yang dapat Anda lakukan dengan mereka sejauh yang saya tahu adalah untuk memeriksa apakah mereka sama atau tidak. Lihat di bawah.
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]
^
Ini dapat digunakan untuk misalnya menegakkan ukuran array yang sama ketika melakukan operasi bit pada Array [Byte].