如何在Haskell中反转图形?

时间:2018-12-21 12:33:55

标签: haskell graph

对于练习,我需要反转图形(反转所有边),但是我什么也没得到。 所以我需要一些帮助。

我知道您可能不想为我解决此练习,所以这不是我要的。我只需要得到一些建议...

所以要了解它:

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]

我得到我需要检查输入图中的每个节点的后继者,并将每个输入节点添加到输出节点的新后继者列表中。

但是我只是不知道如何在Haskell中做到这一点。

感谢您的帮助!


这是我为可能尝试类似操作的人提供的解决方案:

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

1 个答案:

答案 0 :(得分:6)

这是一个提示。让我们考虑G vertices edges的相反情况。 格式为G vertices' edges'

很明显vertices' = vertices

edges'呢?好吧,对于任何值vedges' v必须返回

  • w中所有vertices的列表,使得edge w包含v作为元素”

您可以使用列表推导将上述英语描述转换为Haskell代码。您可以使用x `elem` list来检查x是否是list的元素。