首先,这个问题与许多其他类似主题的SO问题不同,例如: here,here,here,甚至here。还有很多其他的 - 我没有列出所有这些,因为它们主要是关于自动转换。我的问题不同。我正在编写自己的转换,并且正在寻找实现它的通用方法。
我有一个类型类Graph
,我可以从中导出不同的图表表示:GraphSet
(设置表示),AdjMatrix
,AdjList
。
class Graph a where
newGraph :: a
hasVertex :: a -> Int -> Bool
hasEdge :: a -> (Int,Int) -> Bool
addEdge :: a -> (Int,Int) -> a
addVertex :: a -> a
removeEdge :: a -> (Int,Int) -> a
removeVertex :: a -> Int -> a
inDegree :: a -> Int -> Int
outDegree :: a -> Int -> Int
我想要某种方式正式捕获任何表示可以转换为任何其他表示。相应地,我想为上述3个表示中的每个表示2 convert
个函数。我无法找到以通用方式执行此操作的方法。
我最初的尝试是写一个multi-parameter type class
class Equivalent a b where
convert :: b -> a
但这会产生问题,因为每个a
有2 b
个,例如。
instance Equivalent GraphSet AdjMatrix where
convert g@(AdjMatrix mat) = newGraph :: GraphSet -- stub
instance Equivalent AdjList AdjMatrix where
convert g@(AdjMatrix mat) = newGraph :: AdjList -- stub, error
我当然可以编写不同名称的函数,但必须有一种通用的方法来执行此操作。
在有人指出之前,我知道可以选择使用show
然后将结果字符串读入另一种类型。这并不能解决上述问题。
更新:正如评论中所指出的,上面的代码运行得很好。由于某些原因(使用其他语言的经验,其他错误)我错误地认为Haskell不会仅基于返回类型区分函数。正如李瑶在下面提到的那样,read
正是如此。