f# 中多路树的折叠/递归

2023-11-25

我正在尝试将布莱恩的折叠改编为二叉树(http://lorgonblog.wordpress.com/2008/04/06/catamorphisms-part-two/)申请多路树。

布莱恩博客的总结:

数据结构:

type Tree<'a> =  
    | Node of (*data*)'a * (*left*)Tree<'a> * (*right*)Tree<'a>  
    | Leaf 

let tree7 = Node(4, Node(2, Node(1, Leaf, Leaf), Node(3, Leaf, Leaf)),  
                    Node(6, Node(5, Leaf, Leaf), Node(7, Leaf, Leaf)))

二叉树折叠函数

let FoldTree nodeF leafV tree =   
    let rec Loop t cont =   
        match t with   
        | Node(x,left,right) -> Loop left  (fun lacc ->    
                                Loop right (fun racc ->   
                                cont (nodeF x lacc racc)))   
        | Leaf -> cont leafV   
    Loop tree (fun x -> x) 

examples

let SumNodes = FoldTree (fun x l r -> x + l + r) 0 tree7
let Tree6to0 = FoldTree (fun x l r -> Node((if x=6 then 0 else x), l, r)) Leaf tree7

多路树版本 [不(完全)工作]:

数据结构

type MultiTree = | MNode of int * list<MultiTree>

let Mtree7 = MNode(4, [MNode(2, [MNode(1,[]); MNode(3, [])]);  
                    MNode(6, [MNode(5, []); MNode(7, [])])])

折叠功能

let MFoldTree nodeF leafV tree = 
    let rec Loop  tree cont =   
        match tree with   
        | MNode(x,sub)::tail -> Loop (sub@tail) (fun acc -> cont(nodeF x acc))
        | [] -> cont leafV
    Loop  [tree] (fun x -> x) 

实施例1返回 28 - 似乎有效

let MSumNodes = MFoldTree (fun x acc -> x + acc) 0 Mtree7

实施例2

不运行

let MTree6to0 = MFoldTree (fun x acc -> MNode((if x=6 then 0 else x), [acc])) Mtree7

最初我以为MFoldTree需要一个map.something某处但我让它与@改为运算符。

对第二个例子的任何帮助和/或纠正我在第二个例子中所做的事情MFoldTree功能会很棒!

Cheers

dusiod


诀窍在于您需要传递一个附加函数来折叠。

在布莱恩的版本中,折叠功能只需nodeF使用节点中的值以及从左子树和右子树生成的两个值来调用它。

这对于多路树来说是不够的。这里,我们需要一个函数nodeF使用节点中的值以及聚合子树的所有值产生的结果来调用它。但你还需要一个功能 - 比如combineF组合从节点的多个子树产生的值。

你的折叠函数是一个好的开始 - 你只需要再添加一个递归调用来处理tail:

let MFoldTree nodeF combineF leafV tree = 
    let rec Loop trees cont =   
        match trees with   
        | MNode(x,sub)::tail -> 
            // First, process the sub-trees of the current node and get 
            // a single value called 'accSub' representing (aggregated)
            // folding of the sub-trees.
            Loop sub (fun accSub -> 
              // Now we can call 'nodeF' on the current value & folded sub-tree
              let resNode = nodeF x accSub
              // But now we also need to fold all remaining trees that were
              // passed to us in the parameter 'trees'..
              Loop tail (fun accTail ->
                // This produces a value 'accTail' and now we need to combine the
                // result from the tail with the one for the first node 
                // (which is where we need 'combineF')
                cont(combineF resNode accTail) ))
        | [] -> cont leafV
    Loop  [tree] (fun x -> x) 

求和很容易,因为我们只需使用+两个函数的运算符:

let MSumNodes = MFoldTree (+) (+) 0 Mtree7

过滤树更加棘手。这nodeF函数将获取节点中的元素和list子节点(即聚合的结果)并产生single节点。这combineF函数将从第一个节点(即MultiTreevalue)以及从剩余节点生成的子节点列表。从空树生成的初始值是一个空列表:

let MTree6to0 = 
  MFoldTree (fun x children -> MNode((if x=6 then 0 else x), children)) 
            (fun head tail -> head::tail) [] Mtree7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

f# 中多路树的折叠/递归 的相关文章

  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 使用 Java 进行树可视化 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个库来生成图形或树 例如组织图表 该库应该能够从该图中生成纯图像 有谁知道一个好的 希望开源
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • F# 尝试处理未处理的异常

    在下面的代码中 我想读取一个文件并返回所有行 如果存在 IO 错误 我希望程序退出并将错误消息打印到控制台 但程序仍然遇到未处理的异常 对此的最佳实践是什么 我想我不需要Some None因为无论如何我都希望程序在错误时退出 谢谢 let
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • 如何解决 FParsec 错误“组合器‘许多’已应用于解析器,该解析器在不消耗...的情况下成功”

    我有一个看起来足够简单的解析器 我将此子解析器添加到末尾以提供有关一般解析错误的信息 因为所有其他子解析器都失败了 Read the rest of a line as an error let readError parse let re
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • 您可以使用 .net core 运行 F# 脚本文件 (.fsx) 吗?

    是否可以使用 net core 运行 fsx 文件 相当于fsharpi在单声道上 它在 NETCore v3 0 或更高版本中开箱即用 cat hello fsx usr bin env fsharpi printfn hello wor
  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • 合并具有公共字段的列表的最快方法?

    我正在学习 F 并且正在做赔率比较服务 ala www bestbetting com 以将理论付诸实践 到目前为止 我有以下数据结构 type price Bookie string Odds float32 type selection
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple
  • 如何忽略异步块中异步函数的返回值?

    The m1 and m2以下函数中存在编译错误 let m p async return p 2 let m1 async do m 2 ERR was expected int but here has type unit let m2
  • Async.AwaitTask 在 f# 中如何工作?

    我知道 f 和 c 异步模型之间的主要区别在于 在 f 中 除非您调用 Async RunSynchronously 之类的内容 否则异步执行不会开始 在 C 中 当方法返回任务时 通常 并非总是 立即在后台线程中开始执行 Async Aw
  • 从静态成员访问 let 绑定字段

    有没有办法从静态成员访问 let 绑定字段 下面给出了指示的错误 type Foo x let x x static member test let foo Foo System DateTime Now Month printfn A f

随机推荐

  • 连接到 Firebase 的服务是一个坏主意吗?

    我正在构建一个需要实时更新的 Android 应用程序 我的服务器是 Firebase Firebase 旨在当用户连接到服务器时接收其更新的数据 到目前为止 Firebase 给我留下了深刻的印象 但我担心的是当应用程序不活动时接收新数据
  • C 中的整数四舍五入到最接近的十或百

    我正在尝试在 C 中考虑一个满足以下条件的函数 它接受大于 0 的整数作为参数 它将该整数向上舍入到最接近的值 以便只有第一个 数字不为零 例如 53 结果是 60 197 变成 200 4937 结果为 5000 有没有办法做到这一点 以
  • 如何将 FontAwesome 5 Pro 与 React 集成?

    有人可以建议我如何集成 FontAwesome 5Pro与反应 我知道有包 fortawesome react fontawesome 例如 fortawesome fontawesome free regular 但有没有办法包含专业版图
  • QSignalMapper 和原始的 Sender()

    我有一堆QComboBoxes 在表中 为了知道哪一个被触发 我重新映射信号以对表格单元格位置进行编码 如中所述在 QTableWidget 中选择 QComboBox 为什么 Qt 不首先发送单元格激活信号 这样您就可以使用与我不知道的任
  • 使用 R 中两个数据帧的匹配 ID 填充列

    我有两个数据框 df1 df2 我想填写从 df1 到 df2 的 AGE 和 SEX 值 条件是两者之间具有相同的 ID 我尝试了几种使用 for 循环并检查两个数据帧之间的主题 ID 匹配的方法 但失败了 结果应与 df3 中的结果相同
  • JavaScript 排序比较器函数

    基本上我想构建一个函数 通过对象的属性 成员变量之一对数组中的对象进行排序 我非常确定比较器函数是隐藏错误的地方 但我不是 100 确定 调用排序函数后我应该得到的输出是1 2 3 I get 1 3 2这意味着它没有改变 这是整个js代码
  • 如何在 iOS 上检测用户授予麦克风权限?

    所以问题是 在用户授予 或拒绝 使用麦克风的权限后 我需要调用一些函数 我已经看到了这个 AVAudioSession sharedInstance requestRecordPermission BOOL granted if grant
  • 在克隆 GitHub 存储库之前如何查看其大小?

    在决定克隆 Git 存储库之前 有没有办法查看 GitHub 上的 Git 存储库有多大 这似乎是一个非常明显 基本的统计数据 但我根本找不到如何在 GitHub 上查看它 有一种方法可以通过以下方式访问此信息GitHub API Synt
  • 如何将 pandas 中的对象转换为日期

    我有如下的熊猫专栏 January 2014 February 2014 我想将其转换为以下格式 201401 201402 我正在做以下 df date pd to datetime df date format Y B 但是 它给了我一
  • 通过哈希码从内存中获取对象

    我的问题与 JVM 的安全级别有关 如何通过证明哈希码从内存中获取对象 今天我在想 我在执行环境One中创建了一个A类的对象 并从此处获取该对象的哈希码 现在 在另一个执行环境中 我想通过提供哈希码来取回 A 类对象 我认为这是可能的 因为
  • 您可以根据查询创建意图过滤器吗?

    我想让我的应用程序响应我的应用程序的市场链接 所以链接是 market details id my package name 现在我想要这个的原因是这样我可以发送一个链接 如果安装了该应用程序 该链接将打开该应用程序 如果未安装该应用程序
  • 在您的源文件中未检测到实用程序类,请仔细检查“内容”

    我正在尝试设置 Tailwind 3 但我收到了下一个警告 No utility classes were detected in your source files If this is unexpected double check t
  • 如何使WPF程序匹配当前选择的Windows主题

    我想让我的 WPF 应用程序从当前选定的系统主题中绘制 为了说明这一点 这里是我希望完成的 Windows 窗体版本 此 Windows 窗体窗口有一个基本菜单条和一个具有特定主题的工具条 如果用户选择更改主题 其外观将会改变 此外 在 W
  • NullReferenceException 没有给出变量名称是否有原因?

    The ArgumentNullException has a ParamName属性来指示哪个参数作为 null 传递 为什么NullReferenceException没有类似的财产吗 在技 术上可以在 Net 中实现吗 A NullR
  • CSS3渐变背景

    从下到上将浅灰色到白色的渐变背景应用于身体 这样正确吗 body background webkit gradient linear bottom top from e7e7e7 to ffffff DEMO支持所有有能力的浏览器 body
  • 从表行传递多个具有相同名称的请求参数

    我有一个带有复选框的表 用户可以检查并删除表中的该行 我一切正常 但如果用户选中两个框 它只会检索表格上的第一个框 tr td td tr
  • 使用整数映射 Pandas Dataframe 中的字符串值

    在熊猫中DataFrame如何将一列中的字符串与整数映射 我有大约 500 根弦DataFrame并需要将它们替换为以 1 开头的整数 Sample DataFrame Request count 547 GET online WebRes
  • 适用于 MP3、AAC、WAV 的跨平台 (C/C++) 音频库

    我正在尝试找到一个跨平台音频库 该库将具有以下功能 按重要性排序 完整的 Windows Mac Linux 支持 C C API 免费 便宜但具有商业可行性 MP3 支持 AAC 支持 WMA 支持 FLAC 支持 奥格支持 ARM Li
  • SOLR 搜索提供商的 Sitecore 8.1 索引重建策略

    只是通读了下面的索引更新策略文档 但无法得到关于哪种策略最适合 SOLR 搜索实现的明确答案 https doc sitecore net sitecore experience platform search and indexing i
  • f# 中多路树的折叠/递归

    我正在尝试将布莱恩的折叠改编为二叉树 http lorgonblog wordpress com 2008 04 06 catamorphisms part two 申请多路树 布莱恩博客的总结 数据结构 type Tree lt a gt