求叶子的总和

2024-01-03

我应该写这样的代码

具有任意数量子节点的多态树类型可以表示如下(请注意,叶子存储一个列表,内部节点存储“ListTree”列表):

data ListTree a = ListLEAF [a] | ListNODE [(ListTree a)]
 deriving (Show, Read, Eq)

写一个函数foldListTree需要一个函数(f),基值(base) 和一个 ListTree (t)并组合树中叶子注释列表中的值t通过应用函数f。 (从左到右扫描树的叶子)。foldListTree被调用为:

foldListTree f base t where f是 type 的组合函数a->a->a。的类型foldListTree应该:

foldListTree :: (a -> a -> a) -> a -> ListTree a -> a

我试图读取列表中的每个节点,但我猜它正在进入无限循环。

data ListTree a = ListLEAF [a] | ListNODE [(ListTree a)] deriving (Show, Read, Eq)


foldListTree :: (Num a) => (a -> a -> a) -> a -> ListTree a -> a 
foldListTree op base (ListLEAF []) = base
foldListTree op base (ListNODE []) = base
foldListTree op base (ListLEAF [a]) = foldr op base [a]
foldListTree op base (ListNODE b) = (op (foldListTree op base x) 
                                        (foldListTree op base (ListNODE xs)))
                                        where x:xs = b

t4 = ListNODE
       [ ListNODE
           [ ListLEAF [1,2,3]
           , ListLEAF [4,5]
           , ListNODE [ListLEAF [6], ListLEAF []]
           ]
       , ListNODE []
       , ListLEAF [7,8]
       , ListNODE [ListLEAF [], ListLEAF []]
       ]

命令:foldListTree (+) 0 t4

> 错误:*** 异常:indi.hs:(86,1)-(90,54):函数中的非详尽模式foldListTree


如果你打开它真的很有帮助-Wall https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-warnings.html#ghc-flag--Wall因为 Haskell 可以为您提供您未涵盖的模式的列表。

主要问题是你写成模式:

foldListTree op base (ListLEAF [a]) = foldr op base [a]

这意味着您将模式限制为单例列表。代码中没有任何地方有一个模式ListLEAF构造函数接受具有任意数量元素的列表。

但是,您可以通过实现两种情况使上述过程变得简单得多:每个构造函数一个。我们可以用foldListTree作为折叠功能ListNODE case:

foldListTree :: Num a => (a -> a -> a) -> a -> ListTree a -> a 
foldListTree op base (ListLEAF x) = foldr op base x
foldListTree op base (ListNODE b) = foldr (flip (foldListTree op)) base b

这给了我们:

Prelude> foldListTree (+) 0 t4
36

Note: 虽然严格来说没有错,但是我觉得写起来很奇怪LEAF and NODE全部大写,通常用驼峰式写,所以ListLeaf and ListNode.

 

Note: 你的可能会更好ListLeaf存储一个a,不是一个[a],从那时起,您就可以更自由地在叶子中存储什么内容。它根本不排除在叶子中存储列表的可能性,但您将该决定留给数据类型的用户。

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

求叶子的总和 的相关文章

随机推荐

  • R 中的离散全局网格

    我有一个数据集 由与某些 Z 值相关的纬度 经度对组成 例如有关植物植被覆盖程度的数据 我想对这些数据的空间分布进行一些分析 为此 需要对邻近数据点进行分类 我想使用离散全局网格 例如二十面体斯奈德等面积 ISEA 网格或由DGGRID h
  • 如何捕获 KILL 或 HUP 或用户中止信号?

    我有一个在我的 Linux 服务器后台运行的脚本 我想捕获诸如重新启动之类的信号或任何会杀死该脚本的信号 并在实际退出之前保存任何重要信息 我认为我需要捕获的大部分内容是SIGINT SIGTERM SIGHUP SIGKILL 如何捕获这
  • USB 24 位音频流描述符

    我正在制作 USB 耳机的演示 并且对 USB 的音频端点描述符有疑问 我有一个工作的 8 48kHz 16 位音频流 我可以在音频设备的 Windows 属性中选择任何采样频率 我使用以下描述符 Code Interface 2 Spea
  • 插入新值的最佳方式

    我想使用 pandas 数据框来跟踪我将在交易日实时下载的一些市场数据 假设我想记录 AAPL 和 GOOG 的价格 我首先创建一个数据框 prices DataFrame columns AAPL GOOG 假设第一个数据点出现在时间 t
  • EF - WithOptional - 左外连接?

    使用以下一对一模型 均具有导航属性 public class Foo public int Id get set public virtual Bar Bar get set public class Bar public int Id g
  • 升级到 kafka-streams:5.5.0-css (Apache Kafka 2.5.0) 后获取 GlobalKTable 的存储崩溃 [已解决]

    我有一个使用 GlobalKTable 的 Spring Boot 应用程序 它工作正常 直到从 5 3 2 css 更新到 kafka streams 5 5 0 css 与 Apache Kafka 2 5 0 兼容的 Confluen
  • Android 形状中的形状

    我想要一个shape具有两种颜色边框轮廓的元素 我可以使用单色轮廓solid元素 但这只允许我画一条线 我尝试使用两个stroke我的形状中的元素 但这也不起作用 有没有办法在形状中绘制形状或在我的形状周围绘制两条线 顺便说一句 它有圆角
  • Dart2Js 中按位运算,结果错误

    我正在做ZigZag https developers google com protocol buffers docs encoding hl de varints使用 Dart 对 32 位整数进行编码 这是我正在使用的源代码 int
  • 如何更改颤动中的复选框边框颜色?默认情况下,它显示黑色,但我想要灰色

    如何更改颤动中的复选框边框颜色 默认情况下 它显示为黑色 但我希望它显示为灰色 用这个 Checkbox shape RoundedRectangleBorder borderRadius BorderRadius circular 2 0
  • 使用 IQueryable 创建动态查询

    我正在尝试迭代字符串数组并动态创建一个IQueryable询问 它非常简单 但这就是我被困的地方 var query context QuestionsMetaDatas AsQueryable var keywords new List
  • 有界上下文的大小

    我已经开始学习 DDD 的原理 目前正在尝试掌握有界上下文的概念 特别是 您如何决定它必须有多大 或多小 是的 我知道 尽可能小 必要时尽可能大 根据沃恩 弗农的说法 假设我要为博客建模 然后我可以说涉及 3 个有界上下文 1 首页 包含最
  • STTS 标签集的英文翻译

    德语最常见的词性标记集是STTS 标签集 http www ims uni stuttgart de projekte corplex TagSets stts table html 我需要每个标签的解释的英文翻译 作为一名语言学家 我对自
  • SignalR - 从上下文调用静态类型集线器

    我试图弄清楚如何从服务器调用强类型集线器上的方法 我正在使用 Net Core 2 0 我有一个强类型集线器接口 public interface IMessageHub Task Create Message message 和一个看起来
  • Docker compose spring boot redis 连接问题

    我正在运行一个简单的休息应用程序redis在 docker 容器 docker compose 中运行 我相信 redis必须可以使用 Spring Boot 访问http redis 6379 但是 它会抛出错误 018 07 22 21
  • 哪个 Web 应用程序框架与 Neo4J 高度集成?

    我今天一直在研究 Neo4j 我发现它令人兴奋 不知道是否有与Neo4J高度集成的Web应用框架 基本上我想开始尝试 Neo4J 我想也许有明显的 Web 框架选择 如果有的话 我也想尝试一下 你知道任何 编辑 我全部收回 Neo4j 网站
  • Outlook 中的 XML 功能区 - 使其显示在特定窗口上

    我第一次尝试使用 XML 在 Outlook 中创建功能区 但无法具体找到如何告诉我的加载项我只希望功能区显示在资源管理器窗口上 Advice Thanks 我的 Ribbon1 XML 文件
  • 从 javascript 关闭 Firefox 选项卡

    我想从 JavaScript 关闭 Firefox 选项卡 请不要误解我 我不是想关闭弹出窗口 而是关闭选项卡 我知道 JavaScript 无法关闭它尚未打开的窗口 因此我尝试了下面的代码 但它适用于所有浏览器 但不适用于 Firefox
  • 如何从字符串中删除多个违规字符? [复制]

    这个问题在这里已经有答案了 这是我的工作代码 string Input string Output Input data Output Input Replace 在这里 我只是从字符串中删除括号 如果存在 现在 如何扩展 等违规字符列表以
  • %~1 在这个批处理文件中做了什么?

    我找到了这段代码 但有些部分我不明白 这是我的代码 主要 bat echo off set CallCount 0 set Mood set P Mood Your mood is call Receive bat Mood rem Ran
  • 求叶子的总和

    我应该写这样的代码 具有任意数量子节点的多态树类型可以表示如下 请注意 叶子存储一个列表 内部节点存储 ListTree 列表 data ListTree a ListLEAF a ListNODE ListTree a deriving