我正在尝试从列表中创建树。
我已经使用foldl和foldr编写了函数(后未显示)
treeFromList l
| null l = error "no elements in list"
| otherwise = foldl insertIfAbsent (initTree (head l)) (tail l)
其中Tree 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
表示。
有什么建议吗?谢谢!
答案 0 :(得分:2)
您似乎对不同的褶皱感到困惑。
与列表相关的折叠foldr
和foldl
消耗一个列表(或更一般地说,是一个可折叠的)以产生其他内容(可能不是列表)。
与树相关的折叠foldTree
消耗一棵树以产生其他东西(可能不是树)。
因此,您不能从一个切换到另一个:如果只有列表作为输入,则没有树可以用来调用foldTree
。