我有这些数据类型:
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]
但我不断得到错误。你能告诉我怎么改变我的功能吗? 感谢。
答案 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
或上述的任何组合。