हम एक संशोधित दो आयामी व्याकरण वाक्यविन्यास के आधार पर मैट्रिक्स संपीड़न लाइब्रेरी को लागू कर रहे हैं। अब हमारे पास हमारे डेटा प्रकारों के लिए दो दृष्टिकोण हैं-जो स्मृति उपयोग के मामले में बेहतर होगा? (हम कुछ सेक करना चाहते हैं;))।
व्याकरणों में नॉनटर्मिनल होते हैं जिनमें बिल्कुल 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
}
यहां हमारा राइटहैंडसाइड डेटा अगले प्रस्तुतियों को निर्धारित करने के लिए केवल स्ट्रिंग नामों को बचाता है, और जो हम यहां नहीं जानते हैं कि हास्केल इन तारों को कैसे बचाता है। उदाहरण के लिए [[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)]
तो यहाँ सवाल यह है कि स्ट्रिंग "ए" वास्तव में कितनी बार बचा है? एक बार aString में, 4 बार b में और एक बार प्रोडक्शंस में या सिर्फ एक बार aString में और बाकी लोग बस "सस्ता" संदर्भ रखते हैं?
द्वितीय:
data Production = NonTerminal String Production Production Production Production
| Terminal String Int
type ProductionMap = Map String Production
यहां "टर्मिनल" शब्द थोड़ा भ्रामक है क्योंकि इसका वास्तव में उत्पादन है जिसमें दाहिने हाथ के रूप में टर्मिनल है। वही मैट्रिक्स:
a = Terminal "A" 0
b = NonTerminal "B" a a a a
productions = Map.fromList [("A", a), ("B", b)]
और इसी तरह का प्रश्न: उत्पादन कितनी बार आंतरिक रूप से हास्केल द्वारा बचाया जाता है? संभवतः हम प्रोडक्शंस के नाम को छोड़ देंगे यदि हमें उनकी आवश्यकता नहीं है, लेकिन हम अभी इस बारे में निश्चित नहीं हैं।
तो हम कहते हैं कि हमारे पास लगभग 1000 प्रस्तुतियों के साथ एक व्याकरण है। कौन सा दृष्टिकोण कम मेमोरी का उपभोग करेगा?
अंत में हास्केल में पूर्णांक के बारे में एक प्रश्न: वर्तमान में हम स्ट्रिंग्स के रूप में नाम पर योजना बना रहे हैं। लेकिन हम आसानी से पूर्णांक नामों पर स्विच कर सकते हैं क्योंकि 1000 प्रस्तुतियों के साथ हमारे पास और अधिक 4 वर्णों के नाम होंगे (जो कि मैं 32 बिट है?)। हास्केल इसे कैसे संभालती है। क्या एक Int हमेशा 32 Bit और Integer मेमोरी को आवंटित करता है जो वास्तव में इसकी आवश्यकता है?
मैं भी इस के माध्यम से पढ़ने: हास्केल के मूल्य / संदर्भ अर्थ विज्ञान की तैयार परीक्षण - लेकिन मैं समझ नहीं वास्तव में क्या हमारे लिए अर्थ यह है कि - मैं एक जरूरी जावा बच्चे की अधिक कर रहा हूँ तो अच्छा कार्यात्मक प्रोग्रामर: पी