Dalam tak berbentuk, tipe Nat mewakili cara untuk menyandikan bilangan asli pada tingkat tipe. Ini digunakan misalnya untuk daftar ukuran tetap. Anda bahkan dapat melakukan perhitungan pada tingkat jenis, misalnya menambahkan daftarN
elemen ke daftar K
elemen dan mendapatkan kembali daftar yang diketahui pada waktu kompilasi untuk memiliki N+K
elemen.
Apakah representasi ini mampu mewakili angka besar, misalnya 1000000
atau 2 53 , atau akankah ini menyebabkan kompilator Scala menyerah?
scala
numbers
compiler-optimization
shapeless
Rüdiger Klaehn
sumber
sumber
Jawaban:
Saya akan mencoba satu sendiri. Saya dengan senang hati akan menerima jawaban yang lebih baik dari Travis Brown atau Miles Sabin.
Nat saat ini tidak bisa dapat digunakan untuk mewakili jumlah besar
Dalam implementasi Nat saat ini, nilainya sesuai dengan jumlah tipe nested tak berbentuk. Succ []:
Jadi untuk mewakili angka 1000000, Anda akan memiliki tipe yang bersarang level 1000000, yang pasti akan meledakkan kompiler scala. Batas saat ini tampaknya sekitar 400 dari percobaan, tetapi untuk waktu kompilasi yang masuk akal mungkin akan lebih baik untuk tetap di bawah 50.
Namun, ada cara untuk menyandikan bilangan bulat besar atau nilai lain di tingkat tipe, asalkan Anda tidak ingin melakukan perhitungan pada mereka . Satu-satunya hal yang dapat Anda lakukan dengan mereka sejauh yang saya tahu adalah untuk memeriksa apakah mereka sama atau tidak. Lihat di bawah.
Ini dapat digunakan untuk misalnya menegakkan ukuran array yang sama ketika melakukan operasi bit pada Array [Byte].
sumber
ops.nat.Sum
yang akan menyaksikan bahwa dua bilangan bulat tipe memiliki jumlah tertentu, dll. (Mereka hanya harus disediakan oleh makro).Concat
kelas tipe yang memungkinkan untuk menggabungkan dua tipe-string melalui makro. Kelas tipe untuk menjumlahkan bilangan bulat tipe-tingkat mungkin akan terlihat sangat mirip.Shapeless
Nat
mengkodekan bilangan asli pada level tipe menggunakan pengkodean Gereja. Metode alternatif adalah untuk mewakili naturals sebagai tipe tingkat HList bit.Lihatlah padat yang mengimplementasikan solusi ini dalam gaya tak berbentuk.
Saya belum mengerjakannya dalam beberapa saat, dan perlu taburan tak berbentuk '
Lazy
di sana-sini ketika scalac menyerah, tetapi konsepnya solid :)sumber