Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在haskell中反转图形?_Haskell_Graph - Fatal编程技术网

如何在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)
的约束,那么您可以做得更好。这对我帮助很大!非常感谢。