4

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

有许多假人候选人:

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

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

我有两个问题:

  • 是否Map.fromList [(1, ()), (2, ())]占用更多内存let dummy = () in Map.fromList [(1, dummy), (2, dummy)]
  • 考虑到内存占用、cpu 使用率和正确性,建议从bytestring-triedummy构造集合的值是多少?
4

2 回答 2

11

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

()是单元类型的空构造函数()。因此,到处使用()几乎不会消耗任何内存。但是,如果您将类型参数实例化为(),您仍然需要为该参数的存在付费。这就是为什么例如有一个专门Set a的而不是 using的原因Map a ()

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

于 2012-11-29T11:56:51.033 回答
4

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

于 2012-11-29T13:10:24.427 回答