我需要撰寫一個函式 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輸出假。
這是我到目前為止所擁有的:
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 |
^^^^^^^
uj5u.com熱心網友回復:
解決方案是改變函式讀取圖形輸入的方式:
checkNode :: (Eq a, Num a) => [(a, [a])] -> a -> Bool
checkNode [] _ = False
checkNode ((x,_):d) n = if (n == x) then True else checkNode d n
即,將圖形括在圓括號中。
uj5u.com熱心網友回復:
如果您只想檢查是否有一條邊離開該專案(因此查詢位于 2 元組之一的第一項中),您可以檢查:
checkNode :: (Foldable f, Eq a) => f (a, b) -> a -> Bool
checkNode graph q = any ((q ==) . fst) graph
Foldable這將檢查(可以是串列)中的任何專案是否是q第一個專案的 2 元組。
這不會檢查節點是否有傳入邊,例如,4不是圖的節點[(2, [4])]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/452950.html
