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

时间:2017-12-14 19:49:53

标签: haskell

所以我知道这个问题有很多变化,但是我已经读了几个小时的帖子而且我只是卡住了。我在haskell方面做得越来越好,但并没有完全理解一切。

对于初学者来说,这是一项任务,所以我不想要答案寻找一些指导。

我们为此作业声明了这4种类型:

type Node = Integer
type Edge = (Integer, Integer)
type Graph = [Edge]
type Path = [Node]

我目前正在使用的是一个函数,它接受一个Node和一个Graph,并返回一个连接到传入的Node的节点列表。

在我找到了我正在寻找的源节点之后,我真的很难以如何递归地返回元组中的第二个元素。我知道我需要使用fst来抓取每个元组的第一个元素进行比较,但后来我迷路了,我仍然坚持如何正确返回第二个元素(将其添加到我的列表中)然后继续剩下的元组列表。

Neighbors :: Node -> Graph -> [Node]
Neighbors nd gr = 

我一直在阅读有关过滤器的内容,但我不确定在这种情况下是否可行,因为如果我理解正确,它会返回对。寻找任何指导,谢谢

2 个答案:

答案 0 :(得分:3)

您确实可以使用过滤器来查找从给定节点离开的边。然后你需要获取每个边缘的第二个元素。你需要地图。所以你写道:

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 ]

答案 1 :(得分:1)

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

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

如果您能够考虑适当的fg函数,则上面是您可以采取的一系列合理步骤。