图节点搜索 - 无法将预期类型“(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])] 的节点。