Nat ograničenja tipa u bezobličnom

U bezobličnom, tip Nat je način za kodiranje prirodnih brojeva na razini tipa. To se, primjerice, koristi za popise fiksne veličine. Možete čak izvoditi i izračune na razini vrste, na primjer. dodavanje popisa N elemenata na popis K elemenata i vraćanje popisa koji je poznat u vrijeme prevođenja za N+K elemente.

Može li, na primjer, ova reprezentacija predstavljati velike brojeve. 1000000 ili 2 53 ili će dovesti do neuspjeha Scala kompilatora?

144
23 янв. odredio Rüdiger Klaehn 23. siječnja 2014-01-23 02:15 '14 u 2:15 2014-01-23 02:15
@ 2 odgovora

Pokušat ću to sam. Sretan sam što mogu prihvatiti najbolji odgovor od Travisa Browna ili Milesa Sabin.

Trenutno se Nat ne može koristiti za predstavljanje velikog broja.

U trenutnoj implementaciji Nat-a, ova vrijednost odgovara broju ugniježđenih bezobličnih tipova. Succ []:

 scala> Nat(3) res10: shapeless.Succ[shapeless.Succ[shapeless.Succ[shapeless._0]]] = Succ() 

Dakle, da biste predstavili broj 1.000.000, imat ćete vrstu koja će biti ugniježđena na 1.000.000 razina, što će zasigurno eksplodirati kompajler Scala. Čini se da je trenutni limit oko 400 eksperimenata, ali za razumno vrijeme kompajliranja vjerojatno je najbolje ostati ispod 50.

Međutim, postoji način da se kodiraju veliki cijeli brojevi ili druge vrijednosti na razini razine, pod uvjetom da na njima ne želite izvesti izračune. Jedino što možete učiniti s tim, koliko ja znam, jest provjeriti jesu li jednaki ili ne. Pogledajte dolje.

 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] ^ 

To se, primjerice, može koristiti za primjenu iste veličine polja pri izvođenju bit operacija u nizu [Byte].

12
01 окт. odgovor Rüdiger Klaehna 01. \ t 2015-10-01 16:07 '15 u 16:07 2015-10-01 16:07

Bezoblični Nat kodira prirodne brojeve na razini tipa pomoću kodiranja. Alternativna metoda je prikazati prirodne kao HList na razini bita.

Provjerite gusto , što rješenje implementira u bezobličnom stilu.

border=0

Ne radim na tome nakon nekog vremena, a on mora prskati bezobličnu Lazy tu i tamo kada scalac odbija, ali koncept je čvrst:)

2
13 нояб. odgovor je dao beefyhalo 13. studenog 2015-11-13 06:21 '15 u 6:21 AM 2015-11-13 06:21