OCaml中的fold_tree

2023-12-25

你可能知道,OCaml中有一些高阶函数,例如fold_left、fold_right、filter等。

在我的函数式编程课程中,引入了名为fold_tree的函数,它类似于fold_left/right,不是在列表上,而是在(二元)树上。它看起来像这样:

 let rec fold_tree f a t = 
  match t with
    Leaf -> a |
    Node (l, x, r) -> f x (fold_tree f a l) (fold_tree f a r);;

其中树定义为:

type 'a tree = 
  Node of 'a tree * 'a * 'a tree | 
  Leaf;;

好的,这是我的问题:fold_tree 函数如何工作?你能给我一些例子并用人类语言解释一下吗?


这是一个样式建议,将条形放在行的开头。它使案件从哪里开始变得更清楚。为了保持一致性,第一个栏是可选的,但建议使用。

type 'a tree = 
  | Node of 'a tree * 'a * 'a tree
  | Leaf;;

let rec fold_tree f a t = 
    match t with
      | Leaf -> a
      | Node (l, x, r) -> f x (fold_tree f a l) (fold_tree f a r);;

至于它是如何工作的,请考虑以下树:

let t = Node(Leaf, 5, Node(Leaf, 2, Leaf));;

随类型int tree.

从视觉上看,t看起来像这样:



   5
  / \
 ()  2
    / \
   () ()
  

调用fold_tree,我们需要一个函数来组合这些值。根据中的用法Node case, f接受 3 个参数,所有参数都与树的类型相同,并且返回相同的值。我们将这样做:

let f x l r = x + l + r;; (* add all together *)
fold_tree f 1 t;;

这将有助于了解每种情况下发生的情况。对于任何Leaf,返回a。对于任何Node,它将存储的值和左右子树折叠的结果结合起来。在本例中,我们只是将每片叶子算作 1 的数字相加。这棵树折叠的结果是10.

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

OCaml中的fold_tree 的相关文章

  • 作用域函数 apply/with/run/also/let:它们的名字从何而来?

    有很多博客文章 例如this https dzone com articles examining kotlins also apply let run and with intentions 关于标准库函数的用法apply with ru
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • OCaml 作为 C 库,hello world 示例

    我希望通过 C 调用 OCaml 代码 方法是将 OCaml 编译为包含 C 接口的静态或共享库 这一页 https caml inria fr pub docs manual ocaml intfc html似乎解释了如何为 OCaml
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • GLSL 中的二阶函数?

    我正在寻找一种方法来使用一个函数作为 GLSL 中另一个函数的参数 在常规 C 中 可以通过传递函数指针作为函数参数来模拟它 似乎其他语言 如 HLSL 现在提供了处理高级构造 如高阶函数 的方法 或者可以使用以下命令来模拟它们巧妙利用 H
  • 减少/折叠幺半群列表,但减少器返回任一

    我发现自己遇到过几次这样的情况 我有一个减速器 组合 fn 如下所示 def combiner a String b String Either String String a b asRight String 它是一个虚拟实现 但 fn
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • 你能在 scala 中使用 varargs 柯里化一个函数吗?

    我正在考虑如何用可变参数柯里化一种方法 然后我意识到我什至不知道如何去做 理想情况下 它应该让您可以随时开始使用它 然后以可迭代结束 def concat strs String strs mkString val curriedConca
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • F# 中的动态编程

    实现解决问题的动态规划算法的最优雅的方法是什么子问题重叠的问题 http en wikipedia org wiki Overlapping subproblem 在命令式编程中 人们通常会创建一个按问题大小索引的数组 至少在一维 然后算法
  • 相当于 Java 中 C++ 的 std::bind 吗?

    有没有一种方法可以像 C 中的 std bind 一样将 Java 中的参数绑定到函数指针 Java 中类似的东西会是什么 void PrintStringInt const char s int n std cout lt lt s lt
  • 如何使用 Frama-c Value 插件的 Value.Eval_expr、Value.Eval_op 等模块中的函数

    我正在尝试创建一个 frama c 插件 该插件依赖于 Frama c Value 插件 我想获取并打印 C 源代码中所有左值的值集 为了做到这一点 我想使用 Value Eval exprs Value Eval op 等中可用的函数 例
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它

随机推荐

  • 全局“npm ERR!peer dep丢失”可以修复吗?

    寻找明确的直接答案 我已经安装了全局的 包A 假设 aws amplify 例如 aws amplify 包A 有 包B 想要 包C 例如aws amplify 具有需要询问者的询问者自动完成提示 npm ERR peer dep miss
  • 更改用户参数以包含他们的用户名

    要查看我的应用程序上的用户页面 您必须输入他们的 ID user 2 我怎样才能让它使用它们username在参数中而不是用户显示页面的 id 值中 我希望它是 user username or username 任何帮助 将不胜感激 谢谢
  • 数据库架构更改后更新 LINQ to SQL 类的最佳方法

    我在一个项目中使用 LINQ to SQL 类 该项目的数据库设计仍然有些变化 是否有一种简单的方法可以将类与架构同步 或者如果表设计发生更改 我是否需要手动更新类 您可以使用 SQLMetal exe 生成 dbml 和 或 cs vb
  • 如何使用 Tridion Resolver 从发布中删除项目?

    我正在尝试为组件实现自定义解析器 如 Chris 所描述的 http www tridiondeveloper com the story of sdl tridion 2011 custom resolver and the alloww
  • 将 HTML 转换为 contentEditable 中的纯文本

    我有一个contentEditable我删除粘贴内容的格式on paste 通过捕捉事件 然后我聚焦一个文本区域 将内容粘贴到其中 然后复制该值 答案几乎来自here https stackoverflow com a 10551358 1
  • 直接在 Azure Datalake 中将 Python Dataframe 写入 CSV 文件

    我已将 Excel 文件导入到 pandas 数据框中 并完成了数据探索和清理过程 我现在想要将清理后的数据帧写入 csv 文件回 Azure DataLake 而不先将其保存为本地文件 我正在使用熊猫3 我的代码如下所示 token li
  • 任意精度小数算术中的浮点数与有理数 (C/C++)

    由于实现 AP 分数的方法有两种 一种是模拟 AP 的存储和行为double数据类型 仅具有更多字节 另一种是使用现有的整数 APA 实现将小数表示为有理数 即表示为一对整数 分子和分母 这两种方式中哪一种更有可能提供高效的算术在性能方面
  • 如何用 C 语言编写布尔表达式计算器?

    假设我在文本文件中有一个这样的字符串 var1 AND var2 AND var3 OR var4 AND var5 OR var6 AND var7 将其解析为 C 程序并正确处理和设置变量后 它将最终看起来像这样 1 AND 0 AND
  • MVC、DbContext 和多线程

    关于这些主题有很多问题 每个人都有自己的看法 也许有人可以就以下问题给我一个很好的答案 我有一个 Asp NET MVC Web 服务 它使用 EntityFramework 来访问数据库 有一个控制器 每次用户向 Web 服务发出请求时都
  • Ignite C++ 客户端用于 cassandra 集成

    我正在开发一个数据通信应用程序 我想通过 ignite c 与 cassandra 进行通信 当我尝试将数据放入 cassandra 时 它工作正常 但我无法从中获取数据 这是我的代码 test h namespace ignite nam
  • 如何延迟未命名对象的销毁?

    我正在使用TempDir struct https doc rust lang org tempdir tempdir struct TempDir html search 在磁盘上创建和删除文件夹 这TempDir除了其构造之外 代码中并
  • 如何增加 android Log 类的控制台输出

    对于 Android 平台上的默认 Log 控制台输出的字符数量有限 大约等于 3000 多一点 因此 如果消息长度超过 3000 个字符 则不会在屏幕上显示 我还没有找到比这更好的解决方案 public class Log private
  • WPF 和 WCF 数据服务在查询级别进行身份验证?

    所以 我发誓我对如何保护 WCF 数据服务完全感到困惑 在这方面 是否有一种简化的检查方法 以确保将数据发送到 WCF 服务的客户端经过身份验证 确保客户端本身是我编写的客户端 而不是某个模拟客户端 有什么网址可以帮助我解决这个问题吗 我使
  • 为什么在 Python 类定义的生成器中会出现此 NameError?

    在 Python 3 5 0 中 这段代码 a 1 2 class Foo object b 3 4 c tuple i j for j in b for i in a d tuple i j for i in a for j in b 产
  • 用于测试系统稳定性的函数,接收预测的时间序列作为输入

    我想编写一个函数 获取时间序列和标准差作为参数 并返回看起来像预测的调整后的时间序列 通过这个函数 我想测试一个系统的稳定性 该系统获取天气的预测时间序列列表作为输入参数 我对此类函数的方法如下所述 vector
  • getimagesize() 与 finfo_file() 用于检测图像类型?

    有时图像没有扩展名 但仍然有效 我有一个文件上传表单 需要检测文件类型以将其与我的白名单进行比较 我知道我不能信任从浏览器发送的 mime 类型 因此从我所做的研究来看 这两个选项似乎是可用的 它们仅在上传文件后才起作用 info geti
  • 如何在 TypeScript 中访问静态方法

    我正在尝试这样做 但它没有像我预期的那样工作 我使用的是 AMD 选项 logger ts export class Logger static log message string do stuff main ts import logg
  • Javascript 性能 - Dom Reflow - Google 文章

    有人可以向我证明给出的建议吗here http code google com speed articles javascript dom html 复制如下 关于在更改 dom 元素之前删除它们然后重新插入它们的速度更快 作为证明 我想看
  • R 中的加权随机数生成

    我正在尝试生成一组固定范围内的 100 个随机整数 一个可以由 1 到 3 之间的 100 个数字组成 并具有获得 1 2 和 3 之一的特定概率 任何帮助 将不胜感激 See sample 例如 sample c 1 2 3 size 1
  • OCaml中的fold_tree

    你可能知道 OCaml中有一些高阶函数 例如fold left fold right filter等 在我的函数式编程课程中 引入了名为fold tree的函数 它类似于fold left right 不是在列表上 而是在 二元 树上 它看