在Haskell中打印自定义四叉树的建议方法?
在这样的项目中使用四叉树:在Haskell中打印自定义四叉树的建议方法?,haskell,functional-programming,output,Haskell,Functional Programming,Output,在这样的项目中使用四叉树: data Node = A | B | C deriving (Show) data QuadTree = Null | Node Node (QuadTree) (QuadTree) (QuadTree) (QuadTree) deriving Show 这些四叉树的深度预计可达5,正如您可以想象的那样,当仅输出派生的显示时,很快就很难理解树的内容 在深度1中,使用派生的Show,我已经在处理以下内容: Node A (Node B Null Null
data Node = A | B | C deriving (Show)
data QuadTree = Null | Node Node (QuadTree) (QuadTree) (QuadTree) (QuadTree)
deriving Show
这些四叉树的深度预计可达5,正如您可以想象的那样,当仅输出派生的显示时,很快就很难理解树的内容
在深度1中,使用派生的Show,我已经在处理以下内容:
Node A (Node B Null Null Null Null) (Node B Null Null Null Null) (Node C Null Null Null Null) (Node B Null Null Null Null)
我目前简化此输出的方法是使用:
toArray (Node x child1 child2 child3 child4) = [x] ++ toArray child1 ++ toArray child2 ++ toArray child3 ++ toArray child4
。。。这使事情简化了很多:[a,B,B,C,B]代替了替代方案,但随着树的生长,很快就很难解释了
有没有人有什么妙招可以分享?任何建议都将不胜感激
编辑:为了澄清,我只想在调试我将在树上使用的算法时,以最不易引起偏头痛的方式将树的内容视为任何可查看的内容如果您的目标只是获得一个可解释的图形视图,我建议您不要使用纯文本,而是生成HTML,让您的浏览器以方便的方式进行布局。一个特别容易实现的库是警告:它有非常严重的依赖关系
{-# LANGUAGE OverloadedStrings #-}
import Presentation.Yeamer
import GHC.Exts (IsString(..))
data Node = A | B | C deriving (Show)
data QuadTree = Null | Node Node (QuadTree) (QuadTree) (QuadTree) (QuadTree)
deriving Show
displayQuadTree :: QuadTree -> Presentation
displayQuadTree Null = "Null"
displayQuadTree (Node x ch₀ ch₁ ch₂ ch₃)
= "Node "<>fromString (show x) -- Note: the ── and │ operators
── -- are Unicode Box-Drawing
displayQuadTree ch₀ │ displayQuadTree ch₁ -- characters. You can also
── -- use === and ||| instead.
displayQuadTree ch₂ │ displayQuadTree ch₃
main :: IO ()
main = yeamer . displayQuadTree
$ Node A (Node B Null Null Null Null)
(Node B Null Null Null Null)
(Node C Null Null Null Null)
(Node B Null Null Null Null)
Yeamer还可以轻松地以交互方式隐藏和展开子树:如果将Node子句更改为
displayQuadTree (Node x ch₀ ch₁ ch₂ ch₃)
= "Node "<>fromString (show x) ── do
"..."
"qt-node-box" #% (
displayQuadTree ch₀ │ displayQuadTree ch₁
──
displayQuadTree ch₂ │ displayQuadTree ch₃
)
那它只会在第一场演出
通过点击椭圆,你可以只展开真正有趣的部分,比如第一个
然后
最后
此功能使所有这些都可以用于非常大的树,在那里,完整的视图将是压倒性的。您是否需要它是实际表示四叉树的Haskell代码、任何类型的有效Haskell语法、任何类型的纯文本、,或者只是任何类型的可视内容?@leftaround关于任何可视内容-因为它的主要目的是让我在使用这些树时理解它们的内容。谢谢你的提问,我会在问题中澄清这一点。为了简洁的表达,你应该直接以一些简短的格式生成最后的字符串。您可以简单地将Null表示为N,将节点A Null表示为其他终端节点的类似值,将节点A t1 t2 t3 t4表示为A、t1、t2、t3、t4,其中子节点以递归方式表示。或者,考虑类似于许多文件管理器如何显示目录树的2D表示。不那么紧凑,但可能更容易阅读。你能为内部节点添加一些缩进吗?或者甚至通过给盒子加上边框来设计盒子?这太令人印象深刻了。作为一名哈斯克尔初学者,我的头脑被打乱了。。。非常有帮助,谢谢。@Rustang谢谢,但再一次-警告:Yeamer是一个相当重的库,而且相当多的车。如果您想要更轻、更高性能和更可靠的产品,最好像Yeamer在引擎盖下那样直接使用,尽管这不是很简洁。@leftaroundabout OK我会记住这一点,谢谢您提供的额外信息
displayQuadTree (Node x ch₀ ch₁ ch₂ ch₃)
= "Node "<>fromString (show x) ── do
"..."
"qt-node-box" #% (
displayQuadTree ch₀ │ displayQuadTree ch₁
──
displayQuadTree ch₂ │ displayQuadTree ch₃
)