【发布时间】:2013-01-23 18:05:46
【问题描述】:
我已经编写了自己的基于邻接矩阵的图实现,并创建了Read 类的实例。
我的图表采用类型作为输入,这将是边的类型。
如果我尝试像这样的表达方式
read " - - 8 \n - 9 - \n 1 2 3" :: GraphADJ Int
它工作得很好(它是一个有 3 个节点的图,边从第一个节点到第三个节点,从第二个节点到第二个节点,从第三个节点到所有节点)。
我想要做的是不能告诉类型推断边缘的类型,而是将它们放入上下文中(如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 中的某些内容或遗漏了什么?
【问题讨论】:
-
只是好奇,但你为什么不简单地
deriving (Read)并为自定义序列化格式使用单独的函数? -
我不太清楚你所说的“自定义序列化格式”是什么意思,反正我做了我的图实例 read 因为这是我的任务的一部分(现在结束了)。
-
您的
GraphADJ类型是否也适用于Integer参数,即read " - - 8 \n - 9 - \n 1 2 3" :: GraphADJ Integer也可以使用?我猜是这样,你遇到了问题,因为 Haskell 中的数字文字是多态的。试试Characters 而不是数字!
标签: haskell type-inference typeclass