我有这种数据类型:
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] - >网络
你能告诉我怎样才能解决这个问题?
答案 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