Haskell中的内存高效虚拟值

npo*_*cop 4 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使用率和正确性,建议使用bytestring-triedummy构建集合的值是多少?

kos*_*kus 11

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

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

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