haskell - 类型类、关联族 -> 容器、​​键和元素 : Who is who?

标签 haskell containers idioms type-families

正在阅读 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 相关联,并且您必须有一个 GMapk 关联的类型族实例为 k用作 GMapKey .

这些选项之间的选择更取决于您的需求。 GMap k当键类型决定 map 实现时,方法更可取:例如使用 IntMapInt键,但使用另一种类型的 Map对于其他键...

关于haskell - 类型类、关联族 -> 容器、​​键和元素 : Who is who?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499881/

相关文章:

Haskell - 创建集(唯一排序列表) - 无递归,无结点

mysql - 具有多个 Mysql 容器的 Docker 无法正常工作

scala - 在 Scala 中解析文件的惯用方法

types - 什么时候使用关联类型与泛型类型比较合适?

c++ - 我应该为频率图选择什么 C++ 容器?

c++ - 如何在创建时自动注册一个类

haskell - 带状态的 FFI Haskell 回调

function - 基于单独条件的 Haskell 链函数

haskell - 为什么 Text.Show.Functions 只返回 <function>?

c++ - 插入特定数据结构时我做错了什么?