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_Functional Programming_Output - Fatal编程技术网

在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₃
      )