如何在haskell中反转图形?
对于一个练习,我需要反转一个图形(反转所有边),但我什么也做不到。 所以我需要一些帮助 我知道你可能不想帮我解决这个练习,所以这不是我想要的。我只是需要一些建议 因此,为了实现这一目标:如何在haskell中反转图形?,haskell,graph,Haskell,Graph,对于一个练习,我需要反转一个图形(反转所有边),但我什么也做不到。 所以我需要一些帮助 我知道你可能不想帮我解决这个练习,所以这不是我想要的。我只是需要一些建议 因此,为了实现这一目标: data Graph a = G { nodes :: [a] , successors :: a -> [a] } reverseGraph :: Eq a => Graph a -> Graph a 图形必须包含以下参数:节点列表和定义后续节点的函数。此函数的类型为: a->[
data Graph a = G
{ nodes :: [a]
, successors :: a -> [a] }
reverseGraph :: Eq a => Graph a -> Graph a
图形必须包含以下参数:节点列表和定义后续节点的函数。此函数的类型为:
a->[a]
例如:
graph1 :: Graph Int
graph1 = G [1..6] $ \case 1 -> [2,3]
2 -> []
3 -> [1,4,6]
4 -> [1]
5 -> [3,5]
6 -> [2,4,5]
相反的图表是:
reverseGraph graph1 ~>
2 -> [1,6]
3 -> [1,5]
1 -> [3,4]
4 -> [3,6]
6 -> [3]
5 -> [5,6]
我得到,我需要检查输入图中的每个节点的后续节点,并将每个输入节点添加到输出节点的新后续节点列表中
但我不知道在哈斯克尔该怎么做
感谢您的帮助
以下是我为任何可能尝试类似行为的人提供的解决方案:
reverseGraph :: Eq a => Graph a -> Graph a
reverseGraph (G nodes sucs) = (G nodes sucs') where
sucs' a = getVert a nodes sucs
--Makes a list of all occurrences of v in the succeccor list.
getVert :: Eq a => a -> [a] -> (a-> [a]) -> [a]
getVert v [] succs = []
getVert v (n:ns) succs = if v `elem` succs n then [n]++getVert v ns succs else getVert v ns succs
这里有个提示。让我们考虑<代码> G顶点边> /代码>的反向。 其形式为
G顶点“边”
很明显,顶点“=顶点
那边呢?对于任何值v
,edges'v
必须返回
- “在
顶点中所有
的列表,使得w
包含边w
作为一个元素”v
您可以使用列表理解将上述英文描述翻译成Haskell代码。您可以使用
x`elem`list
检查x
是否是list
的一个元素,如果它是oo编程,我会这样做:节点中的foreach x在sucs中的do foreach s在sucs中的do If exists在sucs中的do添加x到sucs的else添加s->[x]但是我不知道如何在函数编程中实现,你需要实际调用每个节点上的函数来找出边的真正含义。这不是一个很好的表示图,它的边需要反转,这就是我的。我也更喜欢不同的东西。[n]+…
写为n:…
要好得多。我认为有一点很重要,那就是reverseGraph
的类型,即它只有Eq a
约束,迫使您使用效率非常低的实现。如果您有Ord a
或(Eq a,Hashable a)
的约束,那么您可以做得更好。这对我帮助很大!非常感谢。