簡體   English   中英

Haskell-搜索元組列表,返回第二個元素

[英]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]

如果可以考慮適當的fg函數,則以上是可以采取的合理步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM