Haskell-搜索元组列表,返回第二个元素



所以我知道这个问题的许多变化已被问到,但是我已经阅读了几个小时的帖子,而我只是卡住了。我在Haskell越来越好,但没有完全理解一切。

对于初学者来说,这是一个任务,所以尽管我不希望答案寻找一些指导。

我们在此任务中声明了这四种类型:

type Node = Integer
type Edge = (Integer, Integer)
type Graph = [Edge]
type Path = [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 ]

确实可以使用过滤器返回图表中感兴趣的那些边缘(即,从目标节点出发的那些)。然后,当您真正想要的是节点列表时,您将有一个边缘列表。您能想到一个可以将边缘列表转换为节点列表的函数,仅在过滤到所需的边缘之后?

edges :: [Edge]
f :: Edge -> Bool
filter f edges :: [Edge]
g :: [Edge] -> [Node]
g (filter f edges) :: [Node]

上面是一组合理的步骤,如果您可以想到适当的fg函数。

最新更新