Kami menerapkan pustaka kompresi matriks berdasarkan sintaksis tata bahasa dua dimensi yang dimodifikasi. Sekarang kami memiliki dua pendekatan untuk tipe data kami - yang mana akan lebih baik jika menggunakan memori? (kami ingin mengompresi sesuatu;)).
Tata bahasa mengandung NonTerminals dengan tepat 4 Productions atau Terminal di sisi kanan. Kami akan membutuhkan nama Productions untuk pemeriksaan kesetaraan dan minimalisasi tata bahasa.
Pertama:
-- | Type synonym for non-terminal symbols
type NonTerminal = String
-- | Data type for the right hand side of a production
data RightHandSide = DownStep NonTerminal NonTerminal NonTerminal NonTerminal | Terminal Int
-- | Data type for a set of productions
type ProductionMap = Map NonTerminal RightHandSide
data MatrixGrammar = MatrixGrammar {
-- the start symbol
startSymbol :: NonTerminal,
-- productions
productions :: ProductionMap
}
Di sini data RightHandSide kami hanya menyimpan nama String untuk menentukan produksi berikutnya, dan apa yang tidak kami ketahui di sini adalah bagaimana Haskell menyimpan string ini. Misalnya matriks [[0, 0], [0, 0]] memiliki 2 produksi:
a = Terminal 0
aString = "A"
b = DownStep aString aString aString aString
bString = "B"
productions = Map.FromList [(aString, a), (bString, b)]
Jadi pertanyaannya di sini adalah seberapa sering String "A" benar-benar disimpan? Sekali dalam aString, 4 kali dalam b dan sekali dalam produksi atau hanya sekali dalam aString dan yang lain hanya memegang referensi "lebih murah"?
Kedua:
data Production = NonTerminal String Production Production Production Production
| Terminal String Int
type ProductionMap = Map String Production
di sini istilah "Terminal" agak menyesatkan karena sebenarnya produksi yang memiliki terminal sebagai sisi kanan. Matriks yang sama:
a = Terminal "A" 0
b = NonTerminal "B" a a a a
productions = Map.fromList [("A", a), ("B", b)]
dan pertanyaan serupa: seberapa sering produksi diselamatkan secara internal oleh Haskell? Mungkin kami akan memasukkan nama-nama di dalam produksi jika kami tidak membutuhkannya, tetapi kami tidak yakin sekarang tentang ini.
Jadi katakanlah kita memiliki tata bahasa dengan sekitar 1000 produksi. Pendekatan mana yang akan mengkonsumsi lebih sedikit memori?
Akhirnya pertanyaan tentang bilangan bulat di Haskell: Saat ini kami berencana memiliki nama sebagai Strings. Tetapi kita dapat dengan mudah beralih ke nama integer karena dengan 1000 produksi kita akan memiliki nama dengan lebih dari 4 karakter (yang saya anggap 32 bit?). Bagaimana Haskell menangani ini. Apakah Int selalu 32 Bit dan Integer mengalokasikan memori yang benar-benar dibutuhkan?
Saya juga membaca ini: Merancang tes nilai / referensi semantik Haskell - tapi saya tidak tahu apa artinya sebenarnya bagi kita - saya lebih dari anak java imperatif kemudian programmer fungsional yang baik: P