Sem forma, o tipo Nat representa uma maneira de codificar números naturais em um nível de tipo. Isso é usado, por exemplo, para listas de tamanho fixo. Você pode até fazer cálculos no nível de tipo, por exemplo, anexar uma lista de N
elementos a uma lista de K
elementos e recuperar uma lista que é conhecida em tempo de compilação por ter N+K
elementos.
Essa representação é capaz de representar grandes números, por exemplo, 1000000
ou 2 53 , ou isso fará com que o compilador Scala desista?
scala
numbers
compiler-optimization
shapeless
Rüdiger Klaehn
fonte
fonte
Respostas:
Vou tentar um eu mesmo. Terei prazer em aceitar uma resposta melhor de Travis Brown ou Miles Sabin.
O Nat atualmente não pode ser usado para representar grandes números
Na implementação atual do Nat, o valor corresponde ao número de tipos aninhados sem forma.Succ []:
Portanto, para representar o número 1000000, você teria um tipo aninhado em 1000000 níveis de profundidade, o que definitivamente explodiria o compilador scala. O limite atual parece ser cerca de 400 da experimentação, mas por tempos razoáveis de compilação provavelmente seria melhor ficar abaixo de 50.
No entanto, existe uma maneira de codificar números inteiros grandes ou outros valores no nível do tipo, desde que você não queira fazer cálculos sobre eles . A única coisa que você pode fazer com as pessoas que eu saiba é verificar se elas são iguais ou não. Ver abaixo.
Isso pode ser usado para, por exemplo, impor o mesmo tamanho de matriz ao realizar operações de bits na matriz [Byte].
fonte
ops.nat.Sum
que testemunhariam que dois números inteiros no nível de tipo tinham uma soma específica etc. (eles apenas precisariam ser fornecidos por uma macro).Concat
classe de tipo que permite concatenar duas seqüências de caracteres de nível de tipo por meio de uma macro. Uma classe de tipo para somar números inteiros em nível de tipo provavelmente seria muito semelhante.O Shapeless's
Nat
codifica números naturais no nível do tipo usando a codificação da Igreja. Um método alternativo é representar os naturais como uma lista de bits de nível de tipo.Confira denso que implementa esta solução em um estilo disforme.
Eu não trabalho nisso há um tempo, e ele precisa de uma pitada de disforme '
Lazy
aqui e ali para quando o scalac desistir, mas o conceito é sólido :)fonte