En informe, le type Nat représente un moyen d'encoder des nombres naturels à un niveau de type. Ceci est utilisé par exemple pour les listes de taille fixe. Vous pouvez même faire des calculs au niveau du type, par exemple ajouter une liste d' N
éléments à une liste d' K
éléments et récupérer une liste qui est connue au moment de la compilation pour avoir des N+K
éléments.
Cette représentation est-elle capable de représenter de grands nombres, par exemple 1000000
ou 2 53 , ou est-ce que cela fera abandonner le compilateur Scala?
scala
numbers
compiler-optimization
shapeless
Rüdiger Klaehn
la source
la source
Réponses:
J'essaierai moi-même. J'accepterai volontiers une meilleure réponse de Travis Brown ou Miles Sabin.
Nat ne peut actuellement pas être utilisé pour représenter de grands nombres
Dans l'implémentation actuelle de Nat, la valeur correspond au nombre de types imbriqués sans forme.Succ []:
Donc, pour représenter le nombre 1000000, vous auriez un type imbriqué à 1000000 niveaux de profondeur, ce qui ferait certainement exploser le compilateur scala. La limite actuelle semble être d'environ 400 à partir de l'expérimentation, mais pour des temps de compilation raisonnables, il serait probablement préférable de rester en dessous de 50.
Cependant, il existe un moyen d'encoder de grands entiers ou d'autres valeurs au niveau du type, à condition que vous ne souhaitiez pas effectuer de calculs sur eux . La seule chose que vous pouvez faire avec ceux-ci pour autant que je sache, c'est de vérifier s'ils sont égaux ou non. Voir ci-dessous.
Cela pourrait être utilisé par exemple pour appliquer la même taille de tableau lors d'opérations sur les bits sur Array [Byte].
la source
ops.nat.Sum
qui témoigneraient que deux entiers au niveau du type avaient une somme particulière, etc. (ils devraient juste être fournis par une macro).Concat
classe de type qui permet de concaténer deux chaînes au niveau du type via une macro. Une classe de type pour la somme des entiers au niveau du type serait probablement très similaire.Shapeless's
Nat
encode les nombres naturels au niveau du type en utilisant l'encodage Church. Une autre méthode consiste à représenter les naturels comme une HList de niveau de type de bits.Découvrez dense qui met en œuvre cette solution dans un style informe.
Je n'ai pas travaillé dessus depuis un moment, et il faut une pincée d'informe '
Lazy
ici et là pour quand scalac abandonne, mais le concept est solide :)la source