修正された2次元文法構文に基づいて、マトリックス圧縮ライブラリを実装しています。データ型に対して2つのアプローチがあります-メモリ使用量の場合、どちらが良いでしょうか?(何かを圧縮したい;))。
文法には、プロダクションが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データは、次の制作を決定するために文字列名のみを保存します。ここでは、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に1回、bに4回、プロダクションに1回、またはaStringに1回だけで、他は単に「安い」参照を保持していますか?
二番目:
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)]
同様の質問:制作物はHaskellによって内部的にどのくらいの頻度で保存されますか?名前が必要なければプロダクション内に名前をドロップするかもしれませんが、これについては今のところわかりません。
約1000のプロダクションを含む文法があるとします。どのアプローチがより少ないメモリを消費しますか?
最後に、Haskellの整数に関する質問:現在、文字列として名前を持つことを計画しています。しかし、1000個のプロダクションでは4文字を超える名前を使用するため、整数名に簡単に切り替えることができます(これは32ビットですか?)。Haskellはこれをどのように処理しますか。Intは常に32ビットで、Integerは本当に必要なメモリを割り当てますか?
私もこれを読みます:Haskellの値/参照セマンティクスのテストを考案します -しかし、それが私たちにとって正確に何を意味するのか理解できません-私はより良い命令型のJavaの子であり、優れた機能的なプログラマーです:P