使用FoldTree从列表中选择树

时间:2019-04-16 12:43:39

标签: haskell tree fold

我正在尝试从列表中创建树。

我已经使用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表示。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您似乎对不同的褶皱感到困惑。

与列表相关的折叠foldrfoldl消耗一个列表(或更一般地说,是一个可折叠的)以产生其他内容(可能不是列表)。

与树相关的折叠foldTree消耗一棵树以产生其他东西(可能不是树)。

因此,您不能从一个切换到另一个:如果只有列表作为输入,则没有树可以用来调用foldTree