在Haskell中转换类型之间的通用方法

时间:2017-04-27 11:26:47

标签: haskell type-conversion

首先,这个问题与许多其他类似主题的SO问题不同,例如: hereherehere,甚至here。还有很多其他的 - 我没有列出所有这些,因为它们主要是关于自动转换。我的问题不同。我正在编写自己的转换,并且正在寻找实现它的通用方法。

我有一个类型类Graph,我可以从中导出不同的图表表示:GraphSet(设置表示),AdjMatrixAdjList

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正是如此。

0 个答案:

没有答案