আমরা একটি পরিবর্তিত দ্বিমাত্রিক ব্যাকরণ সিনট্যাক্সের ভিত্তিতে একটি ম্যাট্রিক্স সংক্ষেপণ গ্রন্থাগারটি প্রয়োগ করছি। এখন আমাদের কাছে আমাদের ডেটা টাইপের জন্য দুটি পন্থা রয়েছে - মেমরি ব্যবহারের ক্ষেত্রে কোনটি ভাল হবে? (আমরা কিছু সংকোচন করতে চাই;))।
ব্যাকরণগুলিতে ডানহাতে পাশের 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)]
সুতরাং এখানে প্রশ্নটি হল স্ট্রিং "এ" সত্যিই কতবার সংরক্ষণ হয়? একবার এস্ট্রিং-এ, 4 বার বি এবং একবার প্রযোজনায় বা একবার কেবল স্ট্রিংয়ে এবং অন্যেরা কেবল "সস্তা" রেফারেন্স রাখেন?
দ্বিতীয়:
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 বিট এবং পূর্ণসংখ্যার মেমরিটির সত্যিকার অর্থে প্রয়োজনীয় বরাদ্দ করে?
আমি এর মাধ্যমে আরও পড়লাম: হাস্কেলের মান / রেফারেন্স শব্দার্থ আবিষ্কারের পরীক্ষা-নিরীক্ষা - তবে আমাদের জন্য এটি ঠিক কী বোঝায় তা বুঝতে পারি না - আমি একজন আবশ্যক জাভা সন্তানের পক্ষে আরও ভাল কর্মক্ষম প্রোগ্রামার: পি