0

我有这些数据类型:

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]

但我不断出错。你能告诉我应该如何改变我的功能吗?谢谢。

4

1 回答 1

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

或以上任意组合。

于 2013-04-10T21:16:27.767 回答