现实世界 Haskell 第 3 章练习:具有 1 个值构造函数的二叉树 - 后续

2023-12-31

这个问题不是重复的

已存在同标题的问题 https://stackoverflow.com/questions/6613871/real-world-haskell-chapter-3-excercise-binary-tree-with-1-value-constructor,但是answer https://stackoverflow.com/a/6614006/5825294在我看来,只部分解决了这个问题,而且我也对它未得到解答的内容感兴趣。

Foreword

现实世界 Haskell 在第 3 章第 58 页中提出了以下二叉树数据类型的定义:

data Tree a = Node a (Tree a) (Tree a)
            | Empty
              deriving (Show)

它提供了两个构造函数(用于空和非空Trees).

另一方面,第 60 页的一个练习挑战读者定义Tree使用单个构造函数的数据类型。

经过多次尝试,我想出了与上面链接相同的解决方案:

data Tree a = Node a (Maybe (Tree a)) (Maybe (Tree a)) deriving(Show)

链接问题中未回答的内容是什么

这个定义的缺点是它不允许实例化一个空的Tree,尽管它允许实例化Tree通过以下语法使用空子项:

Node 3 Nothing (Just (Node 2 Nothing Nothing))

我认为没有比上面更好的解决方案,如果没有“独立”空树是可以接受的,并且要求仅使用一个构造函数。

对上述陈述发表一些评论会很好;然而,我的主要问题是我如何定义Tree使用一个构造函数,这样我就可以实例化一个空的Tree?

既然我已经写了这个问题,我认为一个可能的答案如下,但我对此完全不确定:

如果一个孩子是否为空被编码为它是否是通过构造的Nothing or Just (Node ...),几乎同样适用于整个树(或根节点),它确实可以将其本身定义为Nothing or Just (Node ...);这就是说,只有一个构造函数,Nothing是实例化空树的方法。 (换句话说,我刚刚开始认为这个问题本质上是“格式不正确”的。尽管如此,我还是会发布它,因为我认为我可以从你的评论/答案中学到一些东西。)

以上有道理吗?

一个可能的答案

原始问题中的评论提出了以下解决方案

data Tree a = Tree (Maybe (a,Tree a,Tree a))

(我的理解)允许通过以下方式实例化一棵空树Node Nothing,或非空树Node (Just (value,child1,child2)).


这里有一个提示:您可以使用 n 元组类型将任何 n 元构造函数转换为 1 元构造函数。

例如,您的树类型与以下树类型同构:

data Tree a = Node (a, Tree a, Tree a)
            | Empty

我认为您现在应该能够将这种类型转换为仅涉及一个构造函数的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

现实世界 Haskell 第 3 章练习:具有 1 个值构造函数的二叉树 - 后续 的相关文章

  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 为什么 mod 在表达式中给出的结果与在函数调用中给出的结果不同?

    假设有人想要计算函数 f x y x mod 3 y mod 3 mod 2 那么 如果再展开f 1 0 手动 可以得到 1 mod 3 0 mod 3 mod 2 1 然而 如果使用内联函数 结果是 let f x y x mod 3 y
  • 组合部分函数

    我有两个偏函数f and g 它们没有副作用并且执行速度快 将它们组合成另一个部分函数的最佳方法是什么h这样h isDefinedAt x iff f isDefinedAt x g isDefinedAt f x 如果h是一个返回一个函数
  • 比较两棵树的伪代码

    这是我遇到过几次的问题 并且不确信我使用了最有效的逻辑 例如 假设我有两棵树 一棵是文件夹结构 另一棵是该文件夹结构的内存 模型 我希望比较两棵树 并生成一棵树中存在的节点列表 而不是另一棵树中存在的节点列表 反之亦然 是否有公认的算法来处
  • 如何在 Haskell 中使 CAF 不是 CAF?

    如何将常量应用形式变成 而不是常量应用形式 以阻止它在程序的生命周期中保留 我尝试过这种方法 Dummy parameter to avoid creating a CAF twoTrues gt Bool twoTrues map Tru
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 最低共同祖先算法

    所以我一直在研究实现最低共同祖先算法 我研究了许多不同的算法 主要是 Trajan 解决方案的变体或 RMQ 的变体 我正在使用非二叉树 我的树经常会在查询之间发生变化 因此预处理不一定值得 树的节点数不应超过 50 75 个 我想知道的是
  • 我可以从 GHCi 中找到 GHC 版本吗?

    gt 我在里面输入什么GHCi发现它正在使用哪个 GHC 版本 gt import System Info gt browse arch String compilerName String compilerVersion Data Ver
  • Python 比编译的 Haskell 更快?

    我有一个用 Python 和 Haskell 编写的简单脚本 它读取包含 1 000 000 个换行符分隔的整数的文件 将该文件解析为整数列表 对其进行快速排序 然后将其写入已排序的不同文件中 该文件与未排序的文件具有相同的格式 简单的 这
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • 如何让 esqueleto 为我生成 SQL 字符串?

    我怎样才能让esqueleto从a生成一个SQL字符串from陈述 的文档toRawSql说 你可以打开持久的查询日志记录 我尝试了所有可能的形式MonadLogger我可以理解 但它从未打印任何 SQL 同一文档还说 手动使用此功能 是可
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success
  • 来自数据类型的 Haskell 随机数

    我对 Haskell 还很陌生 我有一个数据类型 data Sentence Prop Int No Sentence And Sentence Or Sentence deriving Eq 我已经为它写了一个 Show 实例 然而 无论
  • 不同类型的列表?

    data Plane Plane point Point normal Vector Double data Sphere Sphere center Point radius Double class Shape s where inte
  • ruby 中的树和图数据结构[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我很难找到在 ruby 中使用的树数据结构 我可以研究一些众所周知的吗 我的要求很简单 我想创建一棵树 或者可能是一个图 并找到一些节点之
  • Cabal:使用源代码构建目录

    我有一个src目录 在这个目录中我有Main hs文件和Test目录 在里面Test我有的目录Test hs模块 我需要用 cabal 来编译它 在我的阴谋集团文件中 我有 Executable main hs or lhs file co
  • 如何在 Twig 中渲染树

    我想渲染一棵深度不确定的树 孩子的孩子的孩子等 我需要递归地循环遍历数组 我怎样才能在 Twig 中做到这一点 我玩过domi27的想法 https stackoverflow com questions 8326482 how to re
  • Haskell:确定函数数量的函数?

    可以写一个函数吗arity a gt Integer确定任意函数的数量 使得 gt arity map 2 gt arity foldr 3 gt arity id 1 gt arity hello 0 是的 这可以非常非常容易地完成 ar

随机推荐

  • 将两个字节字符拆分为两个单字节字符

    我有一个值为 0xB3 的字符 我需要将其分成两个单独的字符 所以 X 0xB 且 Y 0x3 我尝试过以下代码 int main char addr 0xB3 char p addr printf c c n p 0 p 1 This p
  • Linux目录不同组的权限

    我有两个目录 public 和 private 我有三个用户 chris john dan 我有两个组 pub priv 和 god 上帝 组应该具有对 公共 和 私人 的完全访问权限 pub 组应该是唯一拥有 public 权限的组 pr
  • 强调句子或部分的正确 HTML 标签是什么?

    我意识到我正在使用blockquote在我的整个 HTML 中强调学生必须学习的段落 这显然是错误的 因为blockquote旨在指定从其他来源引用的部分 就我而言 数学 段落定义或描述一个单词 并且应该在视觉上脱颖而出 经过一番研究 我发
  • git fsck:duplicateEntries:包含重复的文件条目 - 无法推送到 gitlab

    我们有一个很大的 git 存储库 我想将其推送到一个自托管的 gitlab 实例 问题是 gitlab 远程不允许我推送我的存储库 git push mirror https mygitlab xy myrepo git 这会给我这个错误
  • 如何从 django 模板加载 java 小程序

    当我从静态 applet html 文件调用它时 我的小程序运行文件 如下所示 但是如何将同一行放入 django 模板中呢 我应该把 jar 和 java 文件放在哪里 我还注意到它在查找文件时将 class 附加到 PApplet 并向
  • 错误 - PHP 网页已过期?

    我的 PHP 项目中有六页注册表单 在任何页面之间 如果我按资源管理器栏中的后退按钮 则会收到错误 网页已过期 我在用 POST提交数据 我不明白为什么会出现这种情况 该消息与 IE 处理 POST 数据生成的页面的方式有关 一般来说 为了
  • 使用 pandas 或 numpy 填充缺失的时间序列数据

    我有一个字典列表 如下所示 L timeline 2014 10 total prescriptions 17 timeline 2014 11 total prescriptions 14 timeline 2014 12 total p
  • 使用 javascript 编辑嵌入 SVG 文件的内容

    我有一个包含一些数学方程的 SVG 文件 假设我将此文件包含到我的 html 文档中 现在我想做的是在html文档中使用javascript对svg的内容进行一些简单的修改 一个具体的例子我的 svg 文件包含该方程的格式良好的版本 x 2
  • 如何从命令行重新编译 netbeans 项目?

    我有一个用netbeans开发的java应用程序 我想创建一个批处理文件来重新编译项目并将生成的 jar 文件与一些文档一起打包到 zip 文件中并生成安装程序 安装程序的打包和生成没有问题 但我不知道如何从命令行 批处理文件自动编译 每当
  • 逐字输入字符串

    我刚刚开始学习C 我只是在玩它 遇到了一个问题 涉及逐字输入字符串 每个单词用空格分隔 我的意思是 假设我有 name place animal 作为输入 我想读取第一个单词 对其进行一些操作 然后读取第二个单词 对其进行一些操作 然后读取
  • Ruby on Rails 中 Routes.rb 中的“/#action”路线

    如何创建这种格式的路线 在 Ruby on Rails paths rb 文件中 action id 特别是在动作控制器之前插入 字符 例如 参见http lala com album some album id http lala com
  • 如何拒绝对服务器中的 xml 文件的直接访问

    我有一个 html 文件索引 html 在我的服务器中说 abc com 它访问xyz js like javascript文件依次访问data xml文件 文件索引 html xyz js and data xml位于同一文件夹中 我如何
  • 在 Chrome 扩展程序中显示 Adsense 广告

    我正在尝试通过 Google Chrome 扩展程序获利 该扩展程序有一个大面板 可以向用户显示内容 我想将 Google Adsense 中的小型广告添加到扩展面板中 然而 据我所知 Adsense 帐户要获得批准 必须与包含一些优质内容
  • 使用 Matplotlib 和 Cartopy 绘制基于纬度和经度的地图时,为什么我们使用 crs.PlateCarree() 而不是 crs.Geodetic()?

    我一直在学习如何使用 Cartopy 和 Matplotlib 来绘制地图 但我对这个论点有一个疑问转换 根据 Cartopy 文件 转换指定 数据定义的坐标系 假设我要绘制一个区域的温度 并且该区域已被分成几个网格单元 每个网格单元都有一
  • Android 从 Activity 更改 RecyclerView 适配器上的 TextView textSize

    我正在努力寻找如何改变我的RecyclerView适配器textViews from Activity 在我的活动中我有两个小部件 例如increment text size and decrement text size他们必须更改适配器
  • 如何制作 UIElement 的深层复制?

    所以我有一个为 Silverlight 应用程序提供服务的打印组件 该程序中的其他模块能够向打印组件发出信号并向其传递一个UIElement 然后打印组件会将其绘制到屏幕上 一切都很好 当我尝试操作 UI 元素以便更好地设置其格式以适应用户
  • Rails Action 缓存用户特定记录

    我是一个 Rails 新手 试图为我的应用程序实现缓存 我安装了 memcached 并在development rb中对其进行了如下配置 config action controller perform caching true conf
  • 如何从 Git 中央存储库更新特定文件夹/文件?

    有没有办法在 Git 中单独更新文件夹或文件 我已从中央存储库克隆并希望仅更新特定的文件夹 文件 您可以使用git fetch更新本地克隆中的对象 然后您可以git checkout那些特定的文件 例如 如果您的遥控器称为 origin 并
  • RTSP YouTube 链接

    我已经查遍了谷歌 但无法从 YouTube 视频中获取 rtsp 链接 给定 VIDEO ID 我对如何使用该 id 然后解析 google 的链接感到困惑 感谢您的时间和精力 我找到了这个博客条目 http gdatatips blogs
  • 现实世界 Haskell 第 3 章练习:具有 1 个值构造函数的二叉树 - 后续

    这个问题不是重复的 已存在同标题的问题 https stackoverflow com questions 6613871 real world haskell chapter 3 excercise binary tree with 1