所以我知道这个问题有很多变化,但是我已经读了几个小时的帖子而且我只是卡住了。我在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 =
我一直在阅读有关过滤器的内容,但我不确定在这种情况下是否可行,因为如果我理解正确,它会返回对。寻找任何指导,谢谢
答案 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]
如果您能够考虑适当的f
和g
函数,则上面是您可以采取的一系列合理步骤。