Ich werde es selbst versuchen. Ich werde gerne eine bessere Antwort von Travis Brown oder Miles Sabin annehmen.
Nat kann derzeit nicht zur Darstellung großer Zahlen verwendet werden
In der aktuellen Implementierung von Nat entspricht der Wert der Anzahl der verschachtelten formlosen.Succ [] -Typen:
scala> Nat(3)
res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ()
Um die Zahl 1000000 darzustellen, hätten Sie einen Typ, der 1000000 Ebenen tief verschachtelt ist, was den Scala-Compiler definitiv in die Luft jagen würde. Die aktuelle Grenze scheint beim Experimentieren bei etwa 400 zu liegen, aber für angemessene Kompilierungszeiten ist es wahrscheinlich am besten, unter 50 zu bleiben.
Es gibt jedoch eine Möglichkeit, große Ganzzahlen oder andere Werte auf Typebene zu codieren, vorausgesetzt, Sie möchten keine Berechnungen für sie durchführen . Soweit ich weiß, können Sie mit diesen nur überprüfen, ob sie gleich sind oder nicht. Siehe unten.
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]
^
Dies könnte verwendet werden, um z. B. dieselbe Arraygröße zu erzwingen, wenn Bitoperationen für Array [Byte] ausgeführt werden.