In Shapeless stellt der Nat-Typ eine Möglichkeit dar, natürliche Zahlen auf Typebene zu codieren. Dies wird beispielsweise für Listen mit fester Größe verwendet. Sie können sogar Berechnungen auf Typebene durchführen, z. B. eine Liste von N
Elementen an eine Liste von K
Elementen anhängen und eine Liste zurückerhalten, von der zum Zeitpunkt der Kompilierung bekannt ist, dass sie N+K
Elemente enthält.
Kann diese Darstellung große Zahlen darstellen, z. B. 1000000
oder 2 53 , oder wird der Scala-Compiler dadurch aufgeben?
scala
numbers
compiler-optimization
shapeless
Rüdiger Klaehn
quelle
quelle
Antworten:
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:
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.
Dies könnte verwendet werden, um z. B. dieselbe Arraygröße zu erzwingen, wenn Bitoperationen für Array [Byte] ausgeführt werden.
quelle
ops.nat.Sum
das würde bezeugen , dass zwei Typ-Level - Zahlen eine bestimmte Summe hatte usw. (sie würden nur durch ein Makro zur Verfügung gestellt werden müssen).Concat
Typklasse, mit der zwei Zeichenfolgen auf Typebene über ein Makro verkettet werden können. Eine Typklasse zum Summieren von Ganzzahlen auf Typebene würde wahrscheinlich sehr ähnlich aussehen.Shapeless
Nat
codiert natürliche Zahlen auf Textebene mithilfe der Church-Codierung. Eine alternative Methode besteht darin, die Naturtöne als HL-Liste von Bits auf Typebene darzustellen.Schauen Sie sich dicht an, was diese Lösung in einem formlosen Stil implementiert.
Ich habe eine Weile nicht mehr daran gearbeitet, und es braucht
Lazy
hier und da eine Prise formloser Dinge, wenn Scalac aufgibt, aber das Konzept ist solide :)quelle