在 Haskell 中很好地打印/显示二叉树

2024-01-19

我有一个树数据类型:

data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a

...我需要使它成为一个实例Show,不使用deriving。我发现很好地显示带有两片叶子的小树枝很容易:

instance (Show a, Show b) => Show (Tree a b) where
   show (Leaf x) = show x
   show (Branch val l r) = " " ++ show val ++ "\n" ++ show l ++ "  " ++ show r

但是如何将一个好的结构扩展到任意大小的树呢?似乎确定间距需要我知道最底部有多少叶子(或者总共有多少叶子),以便我可以在那里分配我需要的所有空间并进行工作。 '我可能需要调用一个大小函数。我认为这是可行的,但这是否会让事情变得更加困难?


你可能会研究drawTree http://hackage.haskell.org/package/containers-0.5.7.1/docs/src/Data.Tree.html#drawTree基地内的功能Data.Tree http://hackage.haskell.org/packages/archive/containers/0.3.0.0/doc/html/src/Data-Tree.html模块。只是无耻地导入它会给你这样的东西:

import Data.Tree hiding (Tree )
data Tree a b = Branch b (Tree a b) (Tree a b) 
              | Leaf a deriving (Eq,Ord,Show)

toDataTree (Leaf a) = Node a []
toDataTree (Branch b cs ds) = Node b [toDataTree cs, toDataTree ds]

d = Branch "1" (Branch "11" (Leaf "111") (Leaf "112")) 
               (Branch "12" (Leaf "121") (Leaf "122"))

e = toDataTree d
f = putStrLn $ drawTree e

{-
*Main> f
1
|
+- 11
|  |
|  +- 111
|  |
|  `- 112
|
`- 12
   |
   +- 121
   |
   `- 122
-}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Haskell 中很好地打印/显示二叉树 的相关文章

  • Haskell 将两个列表中不同索引处的元素组合起来

    对这个糟糕的标题表示歉意 我不太确定如何用语言描述它 但这就是我的意思 如果您知道更好的表达方式 请告诉我 假设我有 2 个长度相等的列表 a b c x y z 我想创建列表 a y z b x z c x y 本质上 对于 list1
  • 如何安装 Haskell 控制镜头

    我注意到 Control Lens 不是 Haskell 平台的一部分 所以我可能需要安装它 谁能解释一下如何安装吗 它不是 Haskell 平台的一部分吗 编辑 我正在使用 GHCi 它使用 prelude 警告 此答案仅适用于版本 3
  • 使自定义 monad 转换器成为 MonadError 的实例

    我想让我的 monad 转换器成为一个实例MonadError如果转换后的单子是一个实例 基本上我希望我的变压器的行为与内置变压器一样 例如有一个MonadError实例为StateT MonadError e m gt MonadErro
  • 尝试以特殊行为渲染 Threepenny-gui 中的字段

    我想要做的是设置字段 当它们处于焦点时显示详细信息 而当它们不处于焦点时显示摘要 例如 A 当它失去焦点 变得模糊 时 我将值保存在 状态 映射中 然后将该值更改为旧值的函数 即汇总值 b 当它获得焦点时 我用我在地图中保存的旧值替换摘要值
  • unsafePerformIO 和 FFI 库初始化

    我正在为 C 中的库创建一个 FFI 模块 该模块希望在执行其他操作之前调用一个一次性 不可重入的函数 这个调用是幂等的 但是有状态的 所以我可以在每个 Haskell 调用中调用它 但它很慢 并且由于不可重入 可能会导致冲突 那么现在是使
  • 用户状态(秒差距)

    我正在使用秒差距解析一个表达式 并且我想使用秒差距中的用户状态来跟踪这些表达式中的变量 不幸的是我真的不知道该怎么做 给出以下代码 import Data Set as Set inp x y z data Var V String var
  • Tic-Tac-Toe AI:如何制作树?

    在制作井字游戏机器人时 我在尝试理解 树 时遇到了巨大的障碍 我理解这个概念 但我不知道如何实现它们 有人可以向我展示一个如何为这种情况生成树的示例吗 或者关于生成树的好教程 我想最困难的部分是生成部分树 我知道如何实现生成整棵树 但不知道
  • 什么时候可以将函数绑定到另一个名称?

    在解释器中工作时 将函数绑定到名称通常很方便 例如 ghci gt let f 1 ghci gt f 1 2 这是别名f到函数 1 简单的 然而 这并不总是有效 我发现导致错误的一个例子是尝试使用别名nub来自Data List模块 例如
  • 通过列表搜索

    我一直在尝试定义一个函数 给定一个整数列表和一个整数 n 返回一个布尔值 指示 n 是否在列表中恰好出现一次 我有这个 但它不起作用 我无法弄清楚 once a gt a gt Bool gt Bool filter filter p x
  • macOS 上的堆栈构建

    我是新来的haskell 我有最简单的程序 usr bin env stack stack resolver lts 13 7 script module Main where import Lib main IO main putStrL
  • 是否有使用严格求值的 Haskell 编译器或预处理器?

    我正在寻找一个默认使用严格求值而不是惰性求值的 Haskell 编译器 我只想使用 OCaml 但 Haskell 的语法是好多了比 OCaml 的 Haskell 是纯粹的 并且具有很酷的功能 例如类型类 我真的不想经常把 s and 我
  • Haskell - 无法将类型“PersistEntityBackend record0”与“SqlBackend”匹配

    我正在尝试通过 Yesod 中的 id 获取记录 我的代码是 getEditActorR Handler Html getEditActorR do actorId lt runInputGet ireq intField id actor
  • Haskell 程序的 -hc 配置文件中的 PINNED 是什么意思?

    我正在尝试分析我的应用程序 分析内存使用情况时 hcRTS 选项 我注意到很多内存标记为 PINNED 当与 hy内存被标记为ARR WORDS 该程序使用以下命令创建 2400 2400 双精度矩阵Data Packed Matrixhm
  • 理解 Haskell 中的矩阵转置函数

    这个矩阵转置函数有效 但我试图理解它的逐步执行 但我不明白 transpose a gt a transpose transpose x map head x transpose map tail x with transpose 1 2
  • 有没有办法从 IO monad 中解开类型?

    我有这个非常简单的功能 import qualified Data ByteString Lazy as B getJson IO B ByteString getJson B readFile jsonFile readJFile IO
  • 使用 Template Haskell 生成函数

    是否可以使用 Template Haskell 定义函数 例如 convertStringToValue String gt Int convertStringToValue three 3 convertStringToValue fou
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • 机器和管道(或其他类似的库)之间的概念区别是什么?

    我想学习这个概念 以便我能够理解和使用诸如machines http hackage haskell org package machines 我试着跟随R nar Bjarnason 关于机器的演讲 https dl dropbox co
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M

随机推荐

  • div 上的 CSS 不透明度随着时间延迟而不是用户交互而变化

    我正在尝试在 div 中设置一个图像 该图像将在 5 秒内缓慢出现 不透明度从 0 到 1 我有这个代码 fadeDivIn opacity 1 transition opacity 5s ease in moz transition op
  • 我应该预先分配一个 numpy 数组吗?

    我有一个类及其方法 该方法在执行过程中会重复多次 该方法使用一个numpy数组作为临时缓冲区 我不需要在方法调用之间将值存储在缓冲区内 我是否应该创建数组的成员实例以避免方法执行期间内存分配的时间泄漏 我知道最好使用局部变量 但是 Pyth
  • Webgl:写入 gl_FragDepth 的替代方法

    在WebGL中 是否可以写入片段的深度值或以其他方式控制片段的深度值 据我所知 gl FragDepth 不存在于 webgl 1 x 中 但我想知道是否有其他方法 扩展 浏览器特定支持等 来做到这一点 我想要归档的是让光线追踪对象与使用通
  • 如何从 sql server 2012 中删除拥有架构的用户

    我在 Sql Server 2012 中创建了一个新用户 并且 意外地 将他们标记为多个架构的所有者 我本想将它们标记为架构的成员 但我在错误的选项卡上 因为他们现在是架构的所有者 所以我无法取消选择所有权 也无法删除用户 我怎样才能挽回我
  • 如何在 mapstruct 中使用来自不同类的另一个映射

    我想将模型对象映射到 dto 模型 我已经拥有其中一个对象的映射器 如何在另一个类中的另一个映射器中重用此映射器 我有以下模型 Getter AllArgsConstructor ToString public class History
  • 使用更改源时,有没有办法获取 PouchDB 中文档的所有修订?

    我现在正在摆弄 PouchDB 我使用它作为本地存储数据的一种方式 而不将其链接到 CouchDB 我一直在尝试做的是为单个文档创建一个恢复 撤消方法 为此 我想使用 doc 的先前修订版 我在阅读 PouchDB 文档时遇到了更改提要 起
  • 将鼠标悬停在信息框上会在其后面的标记上触发悬停事件

    我目前正在使用 Google 地图的 InfoBox 插件 不幸的是 我遇到了一个恼人的问题 我的应用程序上的用户可以通过将鼠标悬停在相应的标记上来打开信息框 效果很好 当信息框打开并且用户将鼠标悬停在其上时 会出现此问题 由于某种原因 标
  • 使用 React 上传多个图像

    我想先通过预览来上传多张图像 然后提交以发送它们 我遇到过这样的情况 TypeError Cannot read property files of null 它还只允许我上传一张图像 我创造了files 作为在提交之前安装图像以供审核的方
  • Windows 7下如何设置进程超时?

    我想使用 Windows 批处理文件启动一个程序 但程序应该在一定的超时值后停止 例如 运行程序60秒 60秒后停止 Linux下有这个不错的timeout命令做我想做的事 Windows 也有一个timeout命令 但它只是暂停命令 延迟
  • 生成不重复的随机数。C# [重复]

    这个问题在这里已经有答案了 大家好 我试图在 C 的同一行上生成 6 个不同的数字 但我面临的问题是有些数字在同一行上重复 这是我的代码 var rand new Random List
  • 在 Mercurial 中,如何将反向补丁应用于特定文件?

    相关Mercurial 在一个存储库中的分支之间合并一个文件 https stackoverflow com questions 1078881 mercurial merging one file between branches in
  • 在 iPhone 应用程序中使用 CoreGraphic 描边作为 Alpha 遮罩

    我基本上希望为不同的目的创建类似于 iSteam iFog alebit 的非常简单版本的东西 实际上 将有两个图像 一个是主题图像 另一个是凝结图像或类似图像 然后 用户可以在屏幕上擦拭手指 它将从顶层 剪切 以显示下层 到目前为止 我已
  • 如何在IntelliJ IDEA中查看JDK外部文档?

    此操作的快捷方式是 Shift F1 但它始终呈灰色 即使我已指出 JDKdocumentation path to the docs文件夹 docs 文件夹解压自jdk 7u2 apidocs zip http www oracle co
  • matplotlib 中的交互线

    我正在尝试使用 matplotlib 制作一个交互式绘图 该绘图创建一个端点处带有两个句柄的线段 您可以单击并拖动手柄 线条将刷新以匹配以此方式指定的位置 与此 matplotlib 示例类似多编辑器 http matplotlib org
  • Java spring security - 拦截不同登录的子域url?

    我有一个安装了 spring security 且运行良好的应用程序 它目前已用完www exampledomain com 我现在想扩展在子域之外运行的应用程序 例如newapp exampledomain com 唯一的问题是 对于这个
  • 是否可以在 lambda 表达式中定位 EventHandler?

    举一个简单的例子 如果我有某种按钮 UI 类 我可以编写一个函数来接受指向其的表达式吗 Click事件处理程序 SomeMethod
  • 如何将编辑后的JTable数据保存到数据库?

    首先为我糟糕的英语感到抱歉 我会尽力理解你我的问题 我想要的只是在单击 保存 按钮时保存用户在 JTable 中输入的新数据 我正在从数据库中检索前两列中的学生 ID 姓名 并且我还在第三列中添加了当前日期 并在第四列中添加了缺席 出席 这
  • 如何使用轮盘赌选择最多数量的海龟

    在我的模型中 海龟有两种性别 雄性有两种潜在的策略 雌性会计算一定半径内雄性的数量 我希望雌性根据两种雄性策略的相对频率来权衡从雄性组中选择的概率 无需替换 我已经有了从男性中选择概率的代码 matingPoolProbAnad and m
  • 与默认 emacs 分开改变 Emacs 迷你缓冲区的字体大小?

    我一直在尝试将 emacs 迷你缓冲区的字体 外观与 emacs 默认字体分开 但运气不佳 具体来说 我有兴趣使迷你缓冲区字体大小更大 以便与 emacs MULE 一起使用 因为使用我当前的字体设置 或者如果我在 上网本 屏幕上使用 em
  • 在 Haskell 中很好地打印/显示二叉树

    我有一个树数据类型 data Tree a b Branch b Tree a b Tree a b Leaf a 我需要使它成为一个实例Show 不使用deriving 我发现很好地显示带有两片叶子的小树枝很容易 instance Sho