【问题标题】:Haskell: Show recursive data typeHaskell:显示递归数据类型
【发布时间】:2016-09-20 02:33:57
【问题描述】:

我有一个自定义递归数据类型

data Vertex = Vertex Int [Vertex]

其中Int 是顶点的索引号,[Vertex] 是与该顶点相邻的顶点。

现在,我想将此数据类型显示为顶点索引列表:假设有两个顶点a 和b 分别具有索引1 和2,它们彼此相邻.我的输出应该是这样的:"[(1, [2])]"。

我发现我必须为Vertex 编写一个Show 的实例。这是我的问题,如何显示递归数据类型?我认为 Haskell 的懒惰可能是解决方案?

编辑 - 示例

如上所述,我有 Vertex 数据类型。现在,我有一个包含顶点及其相邻顶点的邻接列表:

adjacencyList :: [Vertex]
adjacencyList = [a, b, c]
 where a = Vertex 6 [b]
       b = Vertex 7 [a, c]
       c = Vertex 12 [b]

当我写这篇文章时

print adjacencyList

我想要这样的输出:

[(6, [7]), (7, [6, 12]), (12, [7])]

【问题讨论】:

  • 我会避免使用 show 来做到这一点 - 当您有输出想要再次将您的函数作为 Haskell 数据结构提供时,您将获得 Show 的好处,最好制作类似的东西ppShow.

标签: haskell


【解决方案1】:

如果您只需要直接邻接,那么递归并不是真正的问题,因为您可以这样做

toAdjacency :: [Vertex] -> [(Int, [Int])]
toAdjacency = map outFrom
  where
    outFrom (Vertex i vs) = (i, map inTo vs)
    inTo (Vertex i _) = i

那么show . toAdjacency 正是您所追求的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 2017-01-30
    • 2016-06-15
    • 2015-05-25
    • 2022-01-06
    • 2014-06-24
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多