![](/img/trans.png)
[英]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.