1

我已经编写了自己的基于邻接矩阵的图实现并创建了Read该类的实例。

我的图表采用类型作为输入,这将是边的类型。

如果我尝试表达

read " - - 8 \n - 9 - \n 1 2 3" :: GraphADJ Int

它工作得很好(它是一个有 3 个节点的图,边缘从第一个节点到第三个,从第二个到第二个,从第三个到所有节点)。

我想要做的是能够不告诉类型推断边缘的类型,而是将它们放入上下文中(如 in read"4"+3)。

我有一个函数insertEdge,它需要一个图表、几个节点和新边。

insertEdge :: Graph g n e => g -> (n, n) -> e -> g

(是作为实例Graph的图的通用类)GraphADJ

所以当我尝试做

 insertEdge (read " - - 8 \n - 9 - \n 1 2 3" :: GraphADJ Int) (1,2) 3

它工作得很好,但如果我不明确类型,我会得到错误 Ambiguous type variables

我是忘记了什么Read还是遗漏了什么?

4

1 回答 1

3

问题是编译器没有足够的信息来推断读取类型。

即使您为ntoIntetoInt编译器提供类型信息,仍然没有g. 它所知道的g只是一个带有Graph g Int Int. g即使在这样的实例中存在单一类型,它仍然无法推断。

编译器无法自动看到在当前范围内只有这样的类型具有这样的实例,因为允许这样的行为可能会通过导入模块导致代码中断。

因此,解决方案要么提供显式签名,要么制作insertEdge提供显式具体类型的专门版本,以为read. 如果您在多个地方将其用于同一类型,则后者将很有用。

于 2013-01-23T18:10:04.890 回答