我们正在基于修改后的二维语法语法实现矩阵压缩库。现在,我们对数据类型有两种方法-如果使用内存,哪种方法更好?(我们要压缩一些东西;))。
语法包含恰好有4个Productions的NonTerminals或右侧的Terminal。我们将需要Productions的名称来进行相等性检查和语法最小化。
首先:
-- | 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中,一次在b中4次,一次在生产中,一次在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)]
还有类似的问题:Haskell在内部保存产品多少次?如果我们不需要生产中的名称,则可能会将其删除,但目前尚不确定。
因此,可以说我们有一个约有1000个作品的语法。哪种方法会消耗更少的内存?
最后一个关于Haskell中整数的问题:当前,我们正在计划将名称命名为Strings。但是我们可以轻松地切换为整数名称,因为使用1000个产品时,我们将拥有超过4个字符的名称(我认为这是32位?)。Haskell如何处理此问题。一个Int是否总是32位并且Integer分配它真正需要的内存?
我还读了以下内容:对Haskell的值/引用语义进行精心设计的测试 -但我无法弄清楚这对我们真正意味着什么-我更是命令式的Java子,然后是优秀的函数式程序员:P