haskell - 使用 FoldTree 从列表中创建树
问题描述
我正在尝试从列表中创建一棵树。
我已经使用 foldl 和 foldr 编写了函数(后者未显示)
treeFromList l
| null l = error "no elements in list"
| otherwise = foldl insertIfAbsent (initTree (head l)) (tail l)
树 DS 在单独的模块中定义为
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving Show
initTree x = (Node x EmptyTree EmptyTree)
并treeFold
手动编写(非派生)为
foldTree f acc t
| (empty t) = acc
| otherwise = foldTree f outerVal (leftSub t)
where
outerVal = f (value t) rightVal
rightVal = foldTree f acc (rightSub t)
在考虑了这一点之后,我相信由于类型冲突而无法做到这一点。理论上,当列表不断减少/折叠时,需要在累加器中建立树。
相反,我能够将foldl
版本转换为foldr
,并且显然foldr
可以使用foldTree
.
有什么建议么?谢谢!
解决方案
您似乎对不同的褶皱感到困惑。
与列表相关的折叠foldr
并foldl
使用一个列表(或者更一般地说,一个可折叠的)来产生其他东西(可能不是一个列表)。
与树相关的折叠foldTree
消耗一棵树来产生其他东西(可能不是一棵树)。
因此,您不能从一个切换到另一个:如果您只有一个列表作为输入,那么您就没有可以调用的树foldTree
。
推荐阅读
- .htaccess - htaccess 301 重定向具有多个变量的 joomla URL
- mysql - Mysql 一对多表
- amazon-s3 - Terraform:将服务器日志记录添加到 S3 存储桶
- javascript - 多个输入文本框,链接到文件描述?
- html - 在这种情况下,如何在 html/php 中将先前的选择存储在下拉菜单中
- c# - C# 集成测试错误
- sql-server - 日志文件夹中的 SQL Server 2008 文件大小不断增加
- ansible - Ansible、vmware_guest 和挂载磁盘
- java - 如何使 Arraylist 具有相同的大小?
- html - 如何在不增加正文大小的情况下使页脚超出页面末尾