Chúng tôi đang triển khai thư viện nén ma trận dựa trên cú pháp ngữ pháp hai chiều được sửa đổi. Bây giờ chúng ta có hai cách tiếp cận cho các loại dữ liệu của mình - cách nào sẽ tốt hơn trong trường hợp sử dụng bộ nhớ? (chúng tôi muốn nén một cái gì đó;)).
Các ngữ pháp chứa NonTermals với chính xác 4 Sản phẩm hoặc Terminal ở phía bên tay phải. Chúng tôi sẽ cần tên của Productions để kiểm tra bình đẳng và tối thiểu hóa ngữ pháp.
Thứ nhất:
-- | 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
}
Ở đây, dữ liệu RightHandSide của chúng tôi chỉ lưu tên Chuỗi để xác định các sản phẩm tiếp theo và điều chúng tôi không biết ở đây là cách Haskell lưu các chuỗi này. Ví dụ: ma trận [[0, 0], [0, 0]] có 2 sản phẩm:
a = Terminal 0
aString = "A"
b = DownStep aString aString aString aString
bString = "B"
productions = Map.FromList [(aString, a), (bString, b)]
Vì vậy, câu hỏi ở đây là chuỗi "A" có thực sự được lưu không? Một lần trong aString, 4 lần trong b và một lần trong sản xuất hoặc chỉ một lần trong aString và những lần khác chỉ giữ các tham chiếu "rẻ hơn"?
Thư hai:
data Production = NonTerminal String Production Production Production Production
| Terminal String Int
type ProductionMap = Map String Production
ở đây thuật ngữ "Terminal" là một chút sai lệch bởi vì thực sự nó là sản phẩm có một thiết bị đầu cuối là phía bên tay phải. Ma trận giống nhau:
a = Terminal "A" 0
b = NonTerminal "B" a a a a
productions = Map.fromList [("A", a), ("B", b)]
và câu hỏi tương tự: mức độ thường xuyên được sản xuất bởi Haskell? Có thể chúng tôi sẽ bỏ tên bên trong sản phẩm nếu chúng tôi không cần chúng, nhưng chúng tôi không chắc chắn ngay bây giờ về điều này.
Vì vậy, giả sử chúng ta có một ngữ pháp với khoảng 1000 sản phẩm. Cách tiếp cận nào sẽ tiêu thụ ít bộ nhớ hơn?
Cuối cùng, một câu hỏi về số nguyên trong Haskell: Hiện tại chúng tôi đang có kế hoạch đặt tên là Chuỗi. Nhưng chúng ta có thể dễ dàng chuyển sang tên nguyên vì với 1000 sản phẩm, chúng ta sẽ có tên có hơn 4 ký tự (mà tôi giả sử là 32 bit?). Làm thế nào để Haskell xử lý này. Có phải một Int luôn là 32 Bit và Integer phân bổ bộ nhớ mà nó thực sự cần?
Tôi cũng đã đọc qua điều này: Phát minh thử nghiệm về ngữ nghĩa tham chiếu / giá trị của Haskell - nhưng tôi không thể hiểu chính xác điều đó có ý nghĩa gì đối với chúng tôi - Tôi là một đứa trẻ java bắt buộc hơn là lập trình viên chức năng tốt: P