图节点搜索 - 无法将预期类型“(a, [a])”与实际类型“[(a, [a])]”匹配
Graph node search - Couldn't match expected type ‘(a, [a])’ with actual type ‘[(a, [a])]’
我需要编写一个函数 checkNode 接受以下形式的图形:
[(1,[2,3]), (2, [3,4])]
作为参数,其中元组中的第一个整数是节点,列表显示初始节点连接到的所有其他节点。
checkNode 有第二个参数,一个整数。
checkNode [(1,[2,3]), (2, [3,4])] 2
输出 True,因为 2 是图中的一个节点,而
checkNode [(1,[2,3]), (2, [3,4])] 7
输出 False。
这是我目前的情况:
checkNode :: (Eq a, Num a) => [(a, [a])] -> a -> Bool
checkNode [] _ = False
checkNode [(x,_):d] n = if (n == x) then True else checkNode d n
这是错误:
test2.hs:53:12: error:
• Couldn't match expected type ‘(a, [a])’
with actual type ‘[(a, [a])]’
• In the pattern: (x, _) : d
In the pattern: [(x, _) : d]
In an equation for ‘checkNode’:
checkNode [(x, _) : d] n = if (n == x) then True else checkNode d n
• Relevant bindings include
checkNode :: [(a, [a])] -> a -> Bool (bound at test2.hs:52:1)
| 53 | checkNode [(x,_):d] n = if (n == x) then True else checkNode d n |
^^^^^^^
解决方案是改变函数读取图形输入的方式:
checkNode :: (Eq a, Num a) => [(a, [a])] -> a -> Bool
checkNode [] _ = False
checkNode ((x,_):d) n = if (n == x) then True else checkNode d n
即,将图形括在圆括号中。
如果您只想检查是否有一条边离开该项目(因此查询位于二元组之一的第一项),您可以检查:
checkNode :: (Foldable f, Eq a) => f (a, b) -> a -> Bool
checkNode graph q = any ((q ==) . fst) graph
这将检查 Foldable
中的任何项目(可以是列表)是否为以 q
作为第一项的二元组。
这不会检查节点是否有传入边,因此 4
不是图 [(2, [4])]
的节点。
我需要编写一个函数 checkNode 接受以下形式的图形:
[(1,[2,3]), (2, [3,4])]
作为参数,其中元组中的第一个整数是节点,列表显示初始节点连接到的所有其他节点。
checkNode 有第二个参数,一个整数。
checkNode [(1,[2,3]), (2, [3,4])] 2
输出 True,因为 2 是图中的一个节点,而
checkNode [(1,[2,3]), (2, [3,4])] 7
输出 False。
这是我目前的情况:
checkNode :: (Eq a, Num a) => [(a, [a])] -> a -> Bool
checkNode [] _ = False
checkNode [(x,_):d] n = if (n == x) then True else checkNode d n
这是错误:
test2.hs:53:12: error:
• Couldn't match expected type ‘(a, [a])’
with actual type ‘[(a, [a])]’
• In the pattern: (x, _) : d
In the pattern: [(x, _) : d]
In an equation for ‘checkNode’:
checkNode [(x, _) : d] n = if (n == x) then True else checkNode d n
• Relevant bindings include
checkNode :: [(a, [a])] -> a -> Bool (bound at test2.hs:52:1)
| 53 | checkNode [(x,_):d] n = if (n == x) then True else checkNode d n |
^^^^^^^
解决方案是改变函数读取图形输入的方式:
checkNode :: (Eq a, Num a) => [(a, [a])] -> a -> Bool
checkNode [] _ = False
checkNode ((x,_):d) n = if (n == x) then True else checkNode d n
即,将图形括在圆括号中。
如果您只想检查是否有一条边离开该项目(因此查询位于二元组之一的第一项),您可以检查:
checkNode :: (Foldable f, Eq a) => f (a, b) -> a -> Bool
checkNode graph q = any ((q ==) . fst) graph
这将检查 Foldable
中的任何项目(可以是列表)是否为以 q
作为第一项的二元组。
这不会检查节点是否有传入边,因此 4
不是图 [(2, [4])]
的节点。