如何在数据定义中要求类型类实例

时间:2016-04-07 08:08:24

标签: haskell typeclass

假设我有这样的类型:

data Graph vertex = Graph {
  vertices :: [vertex],
  edgelist :: [(vertex, [vertex])]
}

但是我希望在类型变量顶点上有一个类型类约束,我试图这样做就像使用类型类定义一样:

data (Eq vertex) => Graph vertex = Graph {
  vertices :: [vertex],
  edgelist :: [(vertex, [vertex])]
}

但是这会产生语法错误Illegal datatype context (use DatatypeContexts)。实现这一目标的正确方法是什么?或者是不可能的?

2 个答案:

答案 0 :(得分:5)

Haskell约定永远不会对数据类型施加约束。相反,将它们放在对数据类型进行操作的函数上。这允许您仅将约束放在实际需要它们的那些函数上。

答案 1 :(得分:3)

您可以做的一件事是使用GADTs

{-# language GADTs #-}
data Graph vertex where
  Graph :: (Eq vertex) => { vertices :: [vertex], edgelist :: [(vertex, [vertex])] } -> Graph vertex

这将确保您在Eq vertex构造函数上进行模式匹配时,范围始终为Graph