假设我有这样的类型:
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)
。实现这一目标的正确方法是什么?或者是不可能的?
答案 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
。