Tôi sẽ cố gắng một mình. Tôi sẵn sàng chấp nhận một câu trả lời tốt hơn từ Travis Brown hoặc Miles Sabin.
Nat hiện không thể được sử dụng để đại diện cho số lượng lớn
Trong triển khai hiện tại của Nat, giá trị tương ứng với số loại hình dạng lồng nhau.Succ []:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Vì vậy, để đại diện cho số 1000000, bạn sẽ có một loại được lồng sâu 1000000 cấp, điều này chắc chắn sẽ làm nổ tung trình biên dịch scala. Giới hạn hiện tại dường như là khoảng 400 từ thử nghiệm, nhưng trong thời gian biên dịch hợp lý, có lẽ tốt nhất là ở dưới 50.
Tuy nhiên, có một cách để mã hóa các số nguyên lớn hoặc các giá trị khác ở cấp độ loại, với điều kiện bạn không muốn thực hiện các phép tính trên chúng . Điều duy nhất bạn có thể làm với những người theo như tôi biết là kiểm tra xem chúng có bằng nhau hay không. Xem bên dưới.
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]
^
Điều này có thể được sử dụng để thực thi kích thước mảng tương tự khi thực hiện các thao tác bit trên Mảng [Byte].