En sin forma, el tipo Nat representa una forma de codificar números naturales a nivel de tipo. Esto se usa, por ejemplo, para listas de tamaño fijo. Incluso puede hacer cálculos a nivel de tipo, por ejemplo, agregar una lista de N
elementos a una lista de K
elementos y recuperar una lista que se sabe que en el momento de la compilación tiene N+K
elementos.
¿Es esta representación capaz de representar grandes números, por ejemplo, 1000000
o 2 53 , o esto hará que el compilador Scala se rinda?
scala
numbers
compiler-optimization
shapeless
Rüdiger Klaehn
fuente
fuente
Respuestas:
Intentaré uno yo mismo. Con mucho gusto aceptaré una mejor respuesta de Travis Brown o Miles Sabin.
Nat no se puede usar actualmente para representar grandes números
En la implementación actual de Nat, el valor corresponde al número de tipos anidados sin forma.Succ []:
Por lo tanto, para representar el número 1000000, tendría un tipo anidado con niveles de 1000000 de profundidad, lo que definitivamente haría explotar el compilador de scala. El límite actual parece ser de aproximadamente 400 por experimentación, pero para tiempos de compilación razonables probablemente sería mejor mantenerse por debajo de 50.
Sin embargo, hay una manera de codificar enteros grandes u otros valores a nivel de tipo, siempre que no desee hacer cálculos sobre ellos . Hasta donde yo sé, lo único que puede hacer es comprobar si son iguales o no. Vea abajo.
Esto podría usarse, por ejemplo, para imponer el mismo tamaño de matriz cuando se realizan operaciones de bits en Array [Byte].
fuente
ops.nat.Sum
que presenciarían que dos enteros de nivel de tipo tenían una suma particular, etc. (solo tendrían que ser proporcionados por una macro).Concat
clase de tipo que permite concatenar dos cadenas de nivel de tipo a través de una macro. Una clase de tipo para sumar enteros de nivel de tipo probablemente se vería muy similar.Shapeless's
Nat
codifica números naturales en el nivel de tipo usando la codificación Church. Un método alternativo es representar los naturales como una lista de bits de nivel de tipo.Echa un vistazo a denso que implementa esta solución en un estilo sin forma.
No he trabajado en eso en mucho tiempo, y necesita una pizca de '
Lazy
aquí y allá sin forma para cuando Scalac se rinda, pero el concepto es sólido :)fuente