地图必须包含所有可能的键?
Map which must contain all possible keys?
Haskell 有多种数据结构,如 Map key value
,在内部使用树或哈希映射。使用这种数据结构时,有可能在查找时,键不存在。
在我的用例中,可能的键集是有限的(从技术上讲,它们在 Enum
和 Ord
中),我只对所有键都存在的映射感兴趣。
如何创建一个类似地图的数据结构来保证所有键都存在于地图中,即它可以具有非部分函数 lookup :: Map key value -> key -> value
(可能对 key
类型有约束, Ord
或 Hashable
或其他)?已经有这样的东西了吗?
换句话说:我想要一个只有在插入所有可能的键时才能查询的数据结构。我可以将常规 Map
与 fromMaybe
一起使用,但我不想指定默认值 – 我想在类型级别保证永远不需要默认值。
您正在查找的结构只是一个函数:Key -> Value
。
您可以 插入 (或实际上替换)以下值
insert :: (Key -> Value) -> Key -> Value -> (Key -> Value)
insert f k v k' = if k == k' then v else f k'
keys
和 values
函数实现起来很简单(你只需要你的 Key 类型是 Enum
)。
如果函数是部分函数,编译器会警告您(最终,无论您使用哪种数据结构,您都无法阻止某人插入 undefined
值)。
您应该研究一种称为 memo(ization) tries 的技术。函数类型A -> B
的memo trie是一种数据类型,将该类型的函数表示为记录所有argument/result组合的数据结构。您可能会浏览的一些链接:
- http://conal.net/blog/posts/elegant-memoization-with-functional-memo-tries
- How does Data.MemoCombinators work?
- https://hackage.haskell.org/package/MemoTrie
但长话短说,Haskell 中的备忘录尝试以惰性构造的形式出现,可能是无限的搜索树,其中每个键的值是通过应用我们正在记忆的函数计算的。
备忘录尝试可能并不完全符合您的要求,但该技术很有可能适用于您的任何目标。
Haskell 有多种数据结构,如 Map key value
,在内部使用树或哈希映射。使用这种数据结构时,有可能在查找时,键不存在。
在我的用例中,可能的键集是有限的(从技术上讲,它们在 Enum
和 Ord
中),我只对所有键都存在的映射感兴趣。
如何创建一个类似地图的数据结构来保证所有键都存在于地图中,即它可以具有非部分函数 lookup :: Map key value -> key -> value
(可能对 key
类型有约束, Ord
或 Hashable
或其他)?已经有这样的东西了吗?
换句话说:我想要一个只有在插入所有可能的键时才能查询的数据结构。我可以将常规 Map
与 fromMaybe
一起使用,但我不想指定默认值 – 我想在类型级别保证永远不需要默认值。
您正在查找的结构只是一个函数:Key -> Value
。
您可以 插入 (或实际上替换)以下值
insert :: (Key -> Value) -> Key -> Value -> (Key -> Value)
insert f k v k' = if k == k' then v else f k'
keys
和 values
函数实现起来很简单(你只需要你的 Key 类型是 Enum
)。
如果函数是部分函数,编译器会警告您(最终,无论您使用哪种数据结构,您都无法阻止某人插入 undefined
值)。
您应该研究一种称为 memo(ization) tries 的技术。函数类型A -> B
的memo trie是一种数据类型,将该类型的函数表示为记录所有argument/result组合的数据结构。您可能会浏览的一些链接:
- http://conal.net/blog/posts/elegant-memoization-with-functional-memo-tries
- How does Data.MemoCombinators work?
- https://hackage.haskell.org/package/MemoTrie
但长话短说,Haskell 中的备忘录尝试以惰性构造的形式出现,可能是无限的搜索树,其中每个键的值是通过应用我们正在记忆的函数计算的。
备忘录尝试可能并不完全符合您的要求,但该技术很有可能适用于您的任何目标。