地图必须包含所有可能的键?

Map which must contain all possible keys?

Haskell 有多种数据结构,如 Map key value,在内部使用树或哈希映射。使用这种数据结构时,有可能在查找时,键不存在。

在我的用例中,可能的键集是有限的(从技术上讲,它们在 EnumOrd 中),我只对所有键都存在的映射感兴趣。

如何创建一个类似地图的数据结构来保证所有键都存在于地图中,即它可以具有非部分函数 lookup :: Map key value -> key -> value(可能对 key 类型有约束, OrdHashable 或其他)?已经有这样的东西了吗?

换句话说:我想要一个只有在插入所有可能的键时才能查询的数据结构。我可以将常规 MapfromMaybe 一起使用,但我不想指定默认值 – 我想在类型级别保证永远不需要默认值。

您正在查找的结构只是一个函数:Key -> Value。 您可以 插入 (或实际上替换)以下值

insert :: (Key -> Value) -> Key -> Value -> (Key -> Value)
insert f k v k' = if k == k' then v else f k'

keysvalues 函数实现起来很简单(你只需要你的 Key 类型是 Enum)。 如果函数是部分函数,​​编译器会警告您(最终,无论您使用哪种数据结构,您都无法阻止某人插入 undefined 值)。

您应该研究一种称为 memo(ization) tries 的技术。函数类型A -> B的memo trie是一种数据类型,将该类型的函数表示为记录所有argument/result组合的数据结构。您可能会浏览的一些链接:

但长话短说,Haskell 中的备忘录尝试以惰性构造的形式出现,可能是无限的搜索树,其中每个键的值是通过应用我们正在记忆的函数计算的。

备忘录尝试可能并不完全符合您的要求,但该技术很有可能适用于您的任何目标。