文件夹如何在此数据树上工作?

Y.G*_*Gao 3 haskell functional-programming

我知道文件夹在Leaf上的工作方式,但是我不知道文件夹在Node上的工作方式。如果我们已经有f和z作为参数,则参数\ xz'是什么。假设我们有

tree = Node [Leaf 1, Leaf 2, Node [Leaf 1, Leaf 3]]
Run Code Online (Sandbox Code Playgroud)

该代码如何工作

foldr (+) 0 tree
Run Code Online (Sandbox Code Playgroud)
data RoseTree a =  Leaf a | Node [RoseTree a] 
instance Foldable RoseTree where 
    foldr f z (Leaf x) = f x z
    foldr f z (Node ns) = 
        foldr (\x z' -> foldr f z' x) z ns 
Run Code Online (Sandbox Code Playgroud)

Iza*_*iss 6

定义foldrNode来电foldr名单上RoseTree秒。然后,在其内部,使用当前累加器作为初始参数foldr,调用foldr每个子树。

基本上,即使函数看起来foldr两次调用,它每次都针对不同的类型调用它,因此只有一个是递归的。另一个是为foldr定义的[a]