เรากำลังใช้ไลบรารีการบีบอัดเมทริกซ์โดยยึดตามไวยากรณ์ไวยากรณ์สองมิติที่ได้รับการแก้ไข ตอนนี้เรามีสองวิธีสำหรับประเภทข้อมูลของเรา - วิธีใดจะดีกว่าในกรณีที่ใช้หน่วยความจำ (เราต้องการบีบอัดบางอย่าง;))
ไวยากรณ์ประกอบด้วย NonTerminals ที่มี 4 โปรดักชั่นหรือเทอร์มินัลทางด้านขวามือ เราจะต้องใช้ชื่อของโปรดักชั่นเพื่อการตรวจสอบความเท่าเทียมกันและการย่อเล็กสุดไวยากรณ์
ครั้งแรก:
-- | 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
}
ที่นี่ข้อมูล RightHandSide ของเราจะบันทึกเฉพาะชื่อ String เพื่อพิจารณาโปรดักชั่นถัดไปและสิ่งที่เราไม่ทราบที่นี่คือวิธีที่ Haskell บันทึกสตริงเหล่านี้ ตัวอย่างเช่นเมทริกซ์ [[0, 0], [0, 0]] มีโปรดักชั่น 2 รายการ:
a = Terminal 0
aString = "A"
b = DownStep aString aString aString aString
bString = "B"
productions = Map.FromList [(aString, a), (bString, b)]
ดังนั้นคำถามในที่นี้คือสตริง "A" บันทึกไว้บ่อยแค่ไหน? ครั้งเดียวใน aString 4 ครั้งใน b และอีกครั้งในโปรดักชั่นหรือเพียงแค่ครั้งเดียวใน aString และคนอื่น ๆ ก็ถือการอ้างอิง "ถูกกว่า"?
ที่สอง:
data Production = NonTerminal String Production Production Production Production
| Terminal String Int
type ProductionMap = Map String Production
นี่คือคำว่า "Terminal" เป็นการทำให้เข้าใจผิดเล็กน้อยเพราะจริงๆแล้วการผลิตที่มีเทอร์มินัลอยู่ทางด้านขวามือ เมทริกซ์เดียวกัน:
a = Terminal "A" 0
b = NonTerminal "B" a a a a
productions = Map.fromList [("A", a), ("B", b)]
และคำถามที่คล้ายกัน: การผลิตจะถูกบันทึกไว้ภายในโดย Haskell บ่อยแค่ไหน? อาจเป็นไปได้ว่าเราจะส่งชื่อในโปรดักชั่นถ้าเราไม่ต้องการ แต่ตอนนี้เราไม่แน่ใจเกี่ยวกับเรื่องนี้
สมมติว่าเรามีไวยากรณ์ที่มีการผลิตประมาณ 1,000 รายการ วิธีใดที่จะใช้หน่วยความจำน้อยลง
ในที่สุดคำถามเกี่ยวกับจำนวนเต็มใน Haskell: ขณะนี้เรากำลังวางแผนที่จะมีชื่อเป็น Strings แต่เราสามารถเปลี่ยนเป็นชื่อจำนวนเต็มได้อย่างง่ายดายเพราะด้วย 1,000 โปรดักชั่นเราจะมีชื่อที่มีมากกว่า 4 ตัวอักษร (ซึ่งฉันถือว่าเป็น 32 บิต) Haskell จัดการเรื่องนี้อย่างไร Int 32 บิตและจำนวนเต็มเสมอจัดสรรหน่วยความจำที่ต้องการจริงๆหรือไม่?
ฉันยังอ่านผ่านสิ่งนี้: การทดสอบการหาค่าความหมายของค่าอ้างอิง / อ้างอิงของ Haskell - แต่ฉันไม่สามารถเข้าใจได้ว่าสิ่งนั้นมีความหมายสำหรับเราอย่างไร - ฉันเป็นเด็กจาวาที่มีความจำเป็นมากกว่า