将图形更改为Haskell中的节点列表

时间:2013-04-10 21:12:43

标签: haskell graph

我有这些数据类型:

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

我想将图表转换为节点列表。例如,我想转此:

Graph [ ( Node 'a' [ ( 'b' , 3 ) , ( 'c' ,2 ) ] ) , ( Node 'b' [ ('c' , 3 ) ] ) , ( Node 'c' [] ) ]

到此:

[ ( Node 'a' [ ( 'b' , 3 ) , ( 'c' ,2 ) ] ) , ( Node 'b' [ ('c' , 3 ) ] ) , ( Node 'c' [] ) ]

我写了这个函数及其它一些变体:

deGraph Graph [Node x y] = [Node x y]

但我不断得到错误。你能告诉我怎么改变我的功能吗? 感谢。

1 个答案:

答案 0 :(得分:4)

你误解了如何在列表上进行模式匹配。

foo [x] = x

匹配单个元素的列表并将该元素绑定到x。

由于您希望它在所有列表上匹配,您可以执行类似

的操作
foo xs = xs

因此您的代码应更改为

deGraph (Graph nodes) = nodes
-- Notice the fact that I wrapped the constructor
-- in parens

总结:

为了明确,以下是您可以在列表中匹配的不同方法

 -- matches on individual elements (this is syntactic sugary goodness)
foo [x, y] = x
 -- grabs the head and tail of the list (This is actual deconstructing)
foo (x:rest) = x
 -- matches an empty list
foo []       = error "Oh noes"
 -- matches everything
foo xs       = head xs

或上述的任何组合。