摆脱Haskell中的Graph关键字

时间:2013-04-19 09:10:47

标签: haskell

我有这种数据类型:

data Node a = Node
    { label :: a,
        adjacent :: [(a,Int)] } deriving (Show, Eq)
data Network a = Graph [Node a] deriving (Show, Eq)

我有一个将Graph转换为节点列表的函数:

deGraph :: ([Node a] -> Network a) -> [Node a] -> [Node a]  
deGraph _ x = x
 for example : 
Main> deGraph Graph [ ( Node 'a' [ ( 'b' , 3 ) , ( 'c' ,2 ) ] ) , ( Node 'b' [ ('c' , 3 ) ] ) , ( Node 'c' [] ) ]
[Node {label = 'a', adjacent = [('b',3),('c',2)]},Node {label = 'b', adjacent = [('c',3)]},Node {label = 'c', adjacent = []}]

但是当我在这样的函数中使用函数时:

func1 (Graph x) = deGraph (Graph x)

我收到此错误:

  

错误“./Network.hs”:14 - 在应用程序中输入错误    *表达式:deGraph(图x)    术语:图表x    类型:网络b   * 不匹配:[节点a] - >网络

你能告诉我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:4)

您的deGraph函数有两个参数,只返回两个中的第二个。

你可能想要这个:

deGraph :: Network a -> [Node a]
deGraph (Graph x) = x

GHCi中对deGraph的调用是有效的,因为你忘了在Graph和下面的列表中加上括号,所以它也是一个带有两个参数的调用。在func1中,您(正确)使用括号,但随后出现类型错误,因为您不一致。

答案 1 :(得分:0)

简单地将Graph作为记录:

data Network a = Graph { nodes :: [Node a] } deriving (Show, Eq)

然后nodes的类型为Network a -> [Node a],可以像

一样调用
Main> nodes $ Graph listOfNodes