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)
定义foldr为Node来电foldr名单上RoseTree秒。然后,在其内部,使用当前累加器作为初始参数foldr,调用foldr每个子树。
基本上,即使函数看起来foldr两次调用,它每次都针对不同的类型调用它,因此只有一个是递归的。另一个是为foldr定义的[a]。