W bezkształtnym typ Nat reprezentuje sposób kodowania liczb naturalnych na poziomie typu. Jest to używane na przykład w przypadku list o stałym rozmiarze. Możesz nawet wykonać obliczenia na poziomie typu, np. Dołączyć listę N
elementów do listy K
elementów i otrzymać listę, która w czasie kompilacji zawiera N+K
elementy.
Czy ta reprezentacja jest w stanie przedstawić duże liczby, np. 1000000
2 53 , czy też spowoduje to, że kompilator Scala się podda?
scala
numbers
compiler-optimization
shapeless
Rüdiger Klaehn
źródło
źródło
Odpowiedzi:
Sam spróbuję. Chętnie przyjmuję lepszą odpowiedź od Travisa Browna lub Milesa Sabina.
Obecnie nie można używać funkcji Nat do reprezentowania dużych liczb
W obecnej implementacji Nat, wartość odpowiada liczbie zagnieżdżonych typów shapeless.Succ []:
Tak więc, aby przedstawić liczbę 1000000, miałbyś typ zagnieżdżony na głębokości 1000000 poziomów, co zdecydowanie wysadziłoby kompilator scala. Obecny limit wydaje się wynosić około 400 z eksperymentów, ale dla rozsądnych czasów kompilacji prawdopodobnie najlepiej byłoby pozostać poniżej 50.
Istnieje jednak sposób kodowania dużych liczb całkowitych lub innych wartości na poziomie typu, pod warunkiem, że nie chcesz wykonywać na nich obliczeń . O ile wiem, jedyne, co możesz z nimi zrobić, to sprawdzić, czy są równe, czy nie. Zobacz poniżej.
Można to wykorzystać np. Do wymuszenia tego samego rozmiaru tablicy podczas wykonywania operacji bitowych na Array [Byte].
źródło
ops.nat.Sum
które świadczyłyby o tym, że dwie liczby całkowite na poziomie typu miałyby określoną sumę itp. (Wystarczyłoby je podać w makrze).Concat
klasy typu, która umożliwia konkatenację dwóch ciągów na poziomie typu za pomocą makra. Klasa typów do sumowania liczb całkowitych na poziomie typu wyglądałaby prawdopodobnie bardzo podobnie.Shapeless
Nat
koduje liczby naturalne na poziomie typu przy użyciu kodowania Church. Alternatywną metodą jest przedstawienie elementów naturalnych jako HList poziomu typu bitów.Sprawdź gęsty, który realizuje to rozwiązanie w bezkształtnym stylu.
Lazy
Dawno nad tym nie pracowałem i trzeba posypać bezkształtnym „ tu i tam, kiedy Scalac się poddaje, ale koncept jest solidny :)źródło