如果我有键到值的映射,那么键组可以实现为固定虚拟值的键映射。
有许多傻瓜候选人:
data
- 没有构造函数的已定义类型forall a . a
)对我来说最明显的解决方案是使用股票单例类型()
但case
我可以将()
与底部区分开来,所以我认为()
的内存表示包括间接。
我有两个问题:
Map.fromList [(1, ()), (2, ())]
占用的内存多于let dummy = () in Map.fromList [(1, dummy), (2, dummy)]
?dummy
构建bytestring-trie集合的值是多少?答案 0 :(得分:11)
Nullary构造函数只分配一次。然后共享它们的所有用途(在GHC中;这种行为不是由Haskell标准决定的。)
()
是单位类型()
的无效构造函数。所以在整个地方使用()
几乎不需要任何记忆。如果您将类型参数实例化为()
,您仍将支付该参数的存在。这就是为什么例如有一个专门的Set a
而不是Map a ()
。
对于键值数据结构,您需要具有适当值的类型。因此,()
是正确的选择,而空数据类型则不是。多态类型如forall a. a
还需要包装在另一种数据类型中,或者如果用作参数则需要不可靠性,这通常不受支持。
答案 1 :(得分:4)
键将全部(表示为)指向单个分配的()
构造函数的指针。