关于 Haskell:Haskell – 搜索元组列表,返回第二个元素

Haskell - Searching list of Tuples, returning second elements

所以我知道有人问过这个问题的许多变体,但我已经阅读了几个小时的帖子,我只是卡住了。我在 haskell 方面越来越好,但没有完全理解所有内容。

对于初学者来说,这是一个作业,所以虽然我不希望答案寻找一些指导。

我们为这个赋值声明了这 4 种类型:

1
2
3
4
type Node = Integer
type Edge = (Integer, Integer)
type Graph = [Edge]
type Path = [Node]

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

一旦我找到了我正在寻找的源节点,我真的很想知道如何递归地返回元组中的第二个元素。我知道我需要使用 fst 来获取每个元组的第一个元素进行比较,但是我在这里迷路了,我被困在如何正确返回第二个元素(将其添加到我的列表中)然后继续剩余的元组列表。

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

我一直在阅读有关过滤器的信息,但我不确定在这种情况下是否有效,因为如果我理解正确,它会返回对。求指导,谢谢


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

1
neighbors nd gr = map snd $ filter (\\x -> fst x == nd) gr

(请注意,Haskell 不允许您以大写字母开头的函数名称)。
如果你想变得很酷,你可以用几乎没有点的方式来写它:

1
neighbors nd  = map snd . filter ((==nd) . fst )

如果你想让它更容易阅读,你可以使用列表推导:

1
neighbors nd gr = [ y | (x,y) <- gr, x==nd ]


filter 确实可以用于仅返回图中您感兴趣的那些边(即从目标节点引出的那些边)。然后你会有一个边列表,而你真正想要的是一个节点列表。在过滤到只需要的边之后,你能想出一个函数可以将边列表转换为节点列表吗?

1
2
3
4
5
edges :: [Edge]
f :: Edge -> Bool
filter f edges :: [Edge]
g :: [Edge] -> [Node]
g (filter f edges) :: [Node]

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