考虑使用存在主义的以下数据模型:
data Node a = Node a (Map TypeRep AnyNode)
data AnyNode = forall a. Show a => AnyNode a
标准类型have been explained previously的内存占用规则。现在,存在类型的规则是什么,例如AnyNode
?
是否有任何优化技术,例如使用unsafeCoerce
的一些变通方法可以避免存在性声明吗?我问这个是因为类似于Node
的类型将被放置在高内存密集型lib的成本中心,所以内存占用就足够了,这就是为什么最脏的黑客是受欢迎的。
答案 0 :(得分:15)
ghc-datasize包可能会有所帮助:
{-# LANGUAGE RankNTypes, GADTs #-}
import GHC.DataSize
data Node = forall a. Show a => Node a
main = do
s <- closureSize $ Node 0
print s -- 24 bytes on my 64-bit system
因此,与普通的一元数据构造函数相比,Node
似乎需要一个额外的单词,大概是因为Show
类字典指针。此外,我尝试向Node
添加更多类约束,并且每个约束都需要一个额外的空格。
我不确定是否有可能在特定情况下魔法消除字典指针。如果你想保留存在主义类型,我认为这是不可能的。