繁体   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