简单的 Haskell 实例问题

3

我正在尝试使用不同的数据结构来实现 Prim 算法。因此,我创建了一个类来抽象化我想做的事情:

class VertexContainer a where
  contains :: a -> Vertex -> Bool
  insert :: a -> WeightedEdge -> a
  numVertices :: a -> Int

现在我想使用一个堆(来自Data.Heap)作为我的顶点容器。但是我无论如何都弄不清语法。从insert声明中可以看出,容器只能容纳WeightedEdge,这是一种数据类型。所以我尝试了:

instance VertexContainer (Heap MinPolicy WeightedEdge) where
  contains _ _ = True

它告诉我这是一种非法的类型同义词。我尝试了各种其他排列方式,但似乎都不起作用。有人能帮我吗?

2个回答

6

如果你仔细阅读整个错误信息,你会发现它告诉你如何在实例声明中使用类型同义词,即通过使用语言扩展TypeSynonymInstances。例如,你可以在命令行中传递-XTypeSynonymInstances。


抱歉,我应该更详细地解释错误。实际上我已经通过了这个测试,我得到的完整错误信息是“实例中的非法类型同义词家族应用程序:”。 - Xodarap
2
你能否在HeapT上声明实例,而不是使用同义词Heap?扫描源代码时,相关类型“Prio”可能正在做一些“不寻常”的事情。 - stephen tetley

1

我将它封装成一个新类型,这样就可以工作了。虽然看起来有些丑陋,但我猜你得等待其中一位 Haskell 大师来回答这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接