haskell - 树折叠操作?

标签 haskell tree fold

我正在 Haskell 中学习一门类(class),我们需要为以下定义的树定义折叠操作:

data Tree a = Lf a | Br (Tree a) (Tree a)

我似乎找不到任何有关“tfold”操作或它应该做什么的信息。任何帮助将不胜感激。

最佳答案

我一直认为折叠是一种用其他函数系统地替换构造函数的方法。因此,举例来说,如果您有一个自己动手的 List 类型(定义为 data List a = Nil | Cons a (List a)),则相应的折叠可以写成:

listfold nil cons Nil = nil
listfold nil cons (Cons a b) = cons a (listfold nil cons b)

或者,也许更简洁,如:

listfold nil cons = go where
    go Nil = nil
    go (Cons a b) = cons a (go b)

listfold 的类型为 b -> (a -> b -> b) -> List a -> b。也就是说,需要两个‘替换构造函数’;一个告诉如何将 Nil 值转换为 b,另一个用于 Cons 构造函数的替换构造函数,告诉 第一个值如何转换为 b code>Cons 构造函数(a 类型)应与 b 类型的值组合(为什么是 b?因为折叠已经被递归应用!)产生一个新的 b,最后是一个 List a 来应用整个 she-bang - 其结果为 b.

在您的情况下,tfold 的类型应该是 (a -> b) -> (b -> b -> b) -> Tree a -> b 通过类比推理;希望您能够从那里得到它!

关于haskell - 树折叠操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9371530/

相关文章:

algorithm - 通过仅以相同顺序插入节点来从 Preorder 获得 BST

c++ - 二叉搜索树计算节点的坐标

haskell - F# 中的箭头 "proc"符号

haskell - 使用 Hedgehog(或任何其他基于属性的测试框架)生成随机 GADT 的最安全方法

java - 通用 N 元树(每个子节点有两个以上节点的树)Java 中使用列表遍历节点的树

string - 用字符串数组折叠

haskell - 使用 foldr 获取符合条件的第一个项目

haskell - 仅使用 foldr 定义 zip 时出现无限类型错误;可以修复吗?

haskell - `flip` 中缀应用程序内联参数

haskell 。 MongoDB 驱动程序或 Aeson 字符集问题