对整数树求和 (Haskell)

2024-03-29

我正在尝试创建一个对非二叉整数树的值求和的函数。

-- datastructures.hs    
data Tree a = Empty | Node a [Tree a] deriving (Eq, Show)

myNums :: (Num a) => Tree a
myNums = Node 1 [ 
           Node 2 [ 
             Node 4 [Empty], Node 5 [Empty]
           ], 
           Node 3 [
             Node 6 [Empty], Node 7 [Empty], Node 8 [Empty] 
           ]
        ]

addNums :: (Num a) => Tree a -> a
addNums Empty = 0
addNums (Node n [Empty]) = n
addNums (Node n (x:xs)) = n + (addNums x) + (addNums xs)

理想情况下,我想要addNums myNums to be 36,但这会产生错误:

datastructures.hs:20:54:
    Couldn't match expected type ‘Tree a’ with actual type ‘[Tree a]’
    Relevant bindings include
      xs :: [Tree a] (bound at datastructures.hs:20:20)
      x :: Tree a (bound at datastructures.hs:20:18)
      n :: a (bound at datastructures.hs:20:15)
      addNums :: Tree a -> a (bound at datastructures.hs:18:1)
    In the first argument of ‘addNums’, namely ‘xs’
    In the second argument of ‘(+)’, namely ‘(addNums xs)’

我该如何应对这个问题,最佳做法是什么?

编辑:最佳实践似乎省略Empty共!我忘记了[]是类型的有效实例[Tree a]。所以实现这个的最好方法是:

data Tree a = Node a [Tree a] deriving (Eq, Show)

addNums :: (Num a) => Tree a -> a
addNums (Node n []) = n
addNums (Node n (x:xs)) = n + (addNums x) + addNums (Node 0 xs)

只需推导即可Foldable并利用现有的sum:

{-# LANGUAGE DeriveFoldable #-}

data Tree a = Empty | Node a [Tree a] deriving (Eq, Show, Foldable)

myNums :: (Num a) => Tree a
myNums = ...

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

对整数树求和 (Haskell) 的相关文章

  • 链表迭代器实现 C++

    我已经在 C 中创建了一个链接列表 并想为其实现一个迭代器 以便我可以执行范围循环 for const int i list where Linked List
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • Haskell:Where 与 Let

    我是 Haskell 的新手 我很困惑Where vs Let 它们似乎都提供了相似的目的 我读过一些比较Where vs Let但我很难辨别何时使用它们 有人可以提供一些背景信息或者一些示例来说明何时使用其中一种而不是另一种吗 哪里与让
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • Haskell 中函数和函子有什么区别?只有定义吗?

    在 Haskell 中 当编写函数时 这意味着我们将某个东西 输入 映射到另一个东西 输出 我尝试 LYAH 来理解 Functor 的定义 看起来和普通 Functor 一样 函数被称为函子有什么限制吗 Functor 是否允许有 I O
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • Webix 树节点的 Font Awesome 图标

    Webix 与 Font Awesome 集成 http docs webix com desktop icon types html 但是如何使用 Font Awesome 图标代替树中的默认文件夹 文件图标来设置各个节点的样式呢 这是我
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl

随机推荐

  • 递归赋值

    def swap aList if len aList 0 return 0 elif len aList 1 print aList 0 return aList 0 return aList 0 swap aList 2 aList a
  • 创建并使用 Babel 插件而不将其设为 npm 模块

    在我的项目中 我使用带有 require 钩子的 Babel 6 我需要加载我编写的自定义 babel 插件 但是我真的需要先使用 npm 发布我的插件 然后将插件名称包含在我的主项目中吗 babelrc 有没有办法直接加载插件代码 换句话
  • 将SQL Server 2005查询结果导出到SQL INSERT语句?

    SQL Server 2005 中有没有一种简单的方法可以将查询结果导出到 SQL INSERT 语句 我正在考虑如何使用数据库资源管理器将现有存储过程编写到新查询窗口中 我们希望将一些数据从开发数据库转移到生产数据库 我了解链接服务器 但
  • Maven 构建错误 - 无法执行目标 org.apache.maven.plugins:maven- assembly-plugin:2.5.5

    我正在尝试使用 Maven 构建项目 不幸的是我没有使用maven的经验所以我有点无助 这很可能是由 riak 子模块引起的 这是带有代码的 github 存储库 YCSB https github com LordFazole YCSB
  • 如何将网格设置为 Items 控件的模板?

    我正在尝试创建一个ItemsControl使用网格作为其ItemsPanel以这样的方式 它有两列 其中第一列宽度是该列中最宽项目的宽度 并且具有显示所有项目所需的尽可能多的行 基本上 我想要以下内容 但不知何故在一个ItemsContro
  • 使用 Rails 更新附加到 Postgresql 中的文本列

    预先感谢您对此提供的任何帮助 我有一个 Rails 模型 其中包含 postgresql 文本列 我想追加 即mycolumn mycolumn newdata 数据添加到现有列 我想要生成的 sql 如下所示 update MyOjbs
  • Akka 2:如何暂停消息处理?

    在我使用 Akka 掌握 Actor 模型的过程中 出现了很多问题 这是另一张 假设我们有一个 Actor 由于某些业务逻辑或可用资源 它必须在给定时间内停止处理消息 可能发生这种情况的情况可能是 节流 可能有一个发送电子邮件的 Actor
  • gcc 可以配置为不打印警告/错误消息中的完整路径吗?

    当 gcc 打印出警告或错误时 它会显示包含错误的文件的完整路径 是否有一个标志可以将输出缩短为仅文件名 这仅取决于您如何调用 gcc tmp c gcc Wall bad c bad c 1 warning return type def
  • 如何在 BigQuery 中通过每个用户的线性插值来填充不规则缺失的时间序列值?

    我有丢失的数据时间序列价值观不规律对于每个用户 我想使用 BigQuery 标准 SQL 通过线性插值以一定的间隔对其进行转换 name time value Jane 2020 11 14 09 01 00 3 Jane 2020 11
  • Django 无法加载模板标签

    我创建了一个templatetags我的应用程序内的文件夹和名为的文件内posts py 我写了以下代码 from django template import Library Node from advancedviews models
  • 如何检查 Jetpack Compose 中列表项的可见性

    FlatList of React Native有财产viewabilityConfigCallbackPairs您可以在其中设置 viewabilityConfig itemVisiblePercentThreshold 50 waitF
  • 从 csv 文件复制 cassandra 表

    我正在我的 Mac 带有 Oracle jdk1 7 0 55 的 Mac OS X Yosemite 上为 Cassandra Apache Spark 和 Flume 设置演示环境 该景观应作为新分析平台的概念证明 因此我需要在我的 c
  • SQL 计数(*) 性能

    我有一个包含超过 2000 万行的 SQL 表 BookChapters 它有一个聚集主键 bookChapterID 并且没有任何其他键或索引 运行以下查询需要几毫秒 if select count from BookChapters 0
  • 在 PHP 关联数组索引中使用空格是一种不好的做法吗?

    我必须使用关联数组传递一些参数 如下所示 blockGroup name products type complete 做了一些测试 我发现它有效 但这是一个不好的做法吗 是否有可能产生任何错误或意外行为 感谢您的任何建议 EDIT 1 我
  • FreeType“通用”与 c++/cx 关键字冲突

    我在将 c 和 c cx 放在一起时遇到问题 我需要使用 FreeType 库 但他们对某些变量使用 通用 名称 我还需要启用 VC 扩展 因为 WinRT 应用程序会导致名称冲突 通用是 c cx 中的关键字 1 gt freetype2
  • 如何查看eclipse“运行配置”使用的shell命令

    给定 Eclipse 中的 运行配置 我想打印出用于运行它的关联 shell 命令 例如 现在 在 Eclipse 中 如果我单击 播放 它将运行 mvn assembly directory Dmaven test skip true 我
  • 使用 SonarQube 进行多模块项目分析

    SonarQube Server 5 1 2 Sonar Runner 2 4 如提供的多模块项目 http docs sonarqube org display SONAR Analyzing with SonarQube Runner
  • 下划线充当分隔符 C# RTF Box

    我正在开发一个 Winforms 应用程序 并使用 RichTextBox 控件上的 Find 来查找要设置样式的特定关键字 由于某种原因 尽管指定了 WholeWord 标志 Find 似乎仍将其中带有下划线的单词视为 2 个单独的单词
  • Peewee MySQL 服务器消失了

    我用烧瓶和尿尿 有时 peewee 会抛出此错误 MySQL server has gone away error 32 Broken pipe Peewee 数据库连接 db PooledMySQLDatabase database pa
  • 对整数树求和 (Haskell)

    我正在尝试创建一个对非二叉整数树的值求和的函数 datastructures hs data Tree a Empty Node a Tree a deriving Eq Show myNums Num a gt Tree a myNums