正在阅读 type families on haskellwiki ,我看例子
class Collects ce where
type Elem ce
empty :: ce
insert :: Elem ce -> ce -> ce
这对我来说很有意义,因为我使用了我的(可能适得其反)OOP 隐喻——Collects 的一个实例有一个关联类型(同义词)Elem ce。集合在某种程度上比元素“更大”。
我对关联数据系列的示例感到困惑,因为它不适合该模型。
class GMapKey k where
data GMap k :: * -> *
empty :: Gmap k v
insert :: k -> v -> GMap k v -> Gmap k v
map 收集 vs 并且感觉比 vs 和 ks '更大'。但似乎 GMapKey 有一个关联的 GMap,当我预计这种关系会反过来。
当我在数据系列和类型同义词系列之间进行选择时,这是要遵循的模式(数据系列:容器是关联类型,类型同义词系列:元素是关联类型)?或者这是否与 IS A/HAS A 的区别无关,并且这两个示例可以互换?
最佳答案
我建议这样考虑:GMap
家庭与 k
相关联,并且您必须有一个 GMap
与 k
关联的类型族实例为 k
用作 GMapKey
.
这些选项之间的选择更取决于您的需求。 GMap k
当键类型决定 map 实现时,方法更可取:例如使用 IntMap
为 Int
键,但使用另一种类型的 Map
对于其他键...
关于haskell - 类型类、关联族 -> 容器、键和元素 : Who is who?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499881/