[英]Haskell: add the second elements of 2 tuples if their first elements are equal, in a list of tuples?
[英]Haskell - Searching list of Tuples, returning second elements
因此,我知道有人問過這個問題的許多變體,但是我已經讀了數小時的帖子,而我只是被卡住了。 我在Haskell方面做得更好,但並沒有完全理解所有內容。
對於初學者來說,這是一項任務,因此雖然我不希望答案尋求指導。
我們為此作業聲明了以下4種類型:
type Node = Integer
type Edge = (Integer, Integer)
type Graph = [Edge]
type Path = [Node]
我目前正在使用的是一個函數,該函數接受一個Node和一個Graph並返回連接到傳入的Node的Node列表。
找到我要找的源節點后,我真的在如何遞歸地返回元組中的第二個元素上感到很掙扎。 我知道我需要使用fst來獲取每個元組的第一個元素以進行比較,但是隨后我迷路了,我被困在如何正確返回第二個元素(將其添加到我的列表中)中,然后繼續進行其余操作的過程元組列表。
Neighbors :: Node -> Graph -> [Node]
Neighbors nd gr =
我一直在閱讀有關過濾器的信息,但不確定在這種情況下是否可以使用,因為如果我理解正確的話,它會返回對。 尋找任何指導,謝謝
您確實可以使用過濾器來查找從給定節點離開的邊。 然后,您需要獲取每個邊的第二個元素。 您需要為此的地圖。 所以你寫:
neighbors nd gr = map snd $ filter (\x -> fst x == nd) gr
(請注意,Haskell不允許您以大寫字母開頭的函數名稱)。 如果您想變酷,可以用幾乎沒有意義的方式編寫它:
neighbors nd = map snd . filter ((==nd) . fst )
而且,如果您想使其更易於閱讀,則可以使用列表推導:
neighbors nd gr = [ y | (x,y) <- gr, x==nd ]
確實可以使用filter來返回圖形中您感興趣的那些邊緣(即,從目標節點引出的那些邊緣)。 然后,當您真正想要的是節點列表時,您將獲得一條邊列表。 在只過濾到所需的邊緣后,您能想到一種可以將邊緣列表轉換為節點列表的功能嗎?
edges :: [Edge]
f :: Edge -> Bool
filter f edges :: [Edge]
g :: [Edge] -> [Node]
g (filter f edges) :: [Node]
如果可以考慮適當的f
和g
函數,則以上是可以采取的合理步驟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.