Haskell中的内存高效虚拟值

时间:2012-11-29 09:44:39

标签: haskell map set trie singleton-type

如果我有键到值的映射,那么键组可以实现为固定虚拟值的键映射。

有许多傻瓜候选人:

  • data - 没有构造函数的已定义类型
  • 其他无人居住的类型(例如forall a . a
  • 单身人士类型
  • 未装箱的类型

对我来说最明显的解决方案是使用股票单例类型()case我可以将()与底部区分开来,所以我认为()的内存表示包括间接。

我有两个问题:

  • Map.fromList [(1, ()), (2, ())]占用的内存多于let dummy = () in Map.fromList [(1, dummy), (2, dummy)]
  • 考虑到内存占用量,CPU使用率和正确性,建议dummy构建bytestring-trie集合的值是多少?

2 个答案:

答案 0 :(得分:11)

Nullary构造函数只分配一次。然后共享它们的所有用途(在GHC中;这种行为不是由Haskell标准决定的。)

()是单位类型()的无效构造函数。所以在整个地方使用()几乎不需要任何记忆。如果您将类型参数实例化为(),您仍将支付该参数的存在。这就是为什么例如有一个专门的Set a而不是Map a ()

对于键值数据结构,您需要具有适当值的类型。因此,()是正确的选择,而空数据类型则不是。多态类型如forall a. a还需要包装在另一种数据类型中,或者如果用作参数则需要不可靠性,这通常不受支持。

答案 1 :(得分:4)

键将全部(表示为)指向单个分配的()构造函数的指针。