如何反转haskell中的图形?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何反转haskell中的图形?相关的知识,希望对你有一定的参考价值。

对于练习我需要反转图形(反转所有边缘),但我没有得到任何结果。所以我需要一些帮助。

我知道你可能不想为我解决这个问题,所以这不是我要求的。我只需要一些建议......

所以要达到它:

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
答案

这是一个提示。让我们考虑G vertices edges的反面。这将是G vertices' edges'的形式。

很明显,vertices' = vertices

怎么样edges'?好吧,对于任何价值vedges' v必须返回

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

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

以上是关于如何反转haskell中的图形?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BackStack 上反转片段动画?

如何在 Haskell 中连接幻像类型中的元组?

哈斯克尔。我很困惑这个代码片段是如何工作的

如何反转 seaborn 图形级别图的轴(FacetGrid)

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段

Python 中的反转字符串:reversed()切片等