snippetMinor
Implement `fold` on a "Rose Tree"
Viewed 0 times
foldrosetreeimplement
Problem
Given the following algebraic data type, a Rose Tree:
I attempted a
test
Please review this implementation.
Given my definition of
My understanding is that, for the return type,
data Tree a = Node {
rootLabel :: a,
subForest :: [Tree a]
}I attempted a
foldTree function to fold over this list: (credit to this class's homework from 2013:treeFold :: (b -> [b] -> b) -> (a -> b) -> Tree a -> b
treeFold f g tree = f (g (rootLabel tree)) (map (g . rootLabel) (subForest tree))test
*Party> let tree = Node { rootLabel = 100, subForest = [] }
*Party> let tree2 = Node { rootLabel = 200, subForest = [tree] }
*Party> add tree2
300Please review this implementation.
Given my definition of
treeFold, I don't see how I could fold over a Tree Char, producing a [Char]/String result. My understanding is that, for the return type,
b, it can't be [a].Solution
The implementation isn't correct, because it doesn't traverse sub-trees. Consider
Then your folding function will only fold over 1 and 2, but not over 3.
If you have a recursive structure like this, a folding function over it must also be recursive. Otherwise it won't be able to traverse arbitrarily large recursive structure.
For the other question: If you specialize the folding function as
by setting
Update: The signature also isn't correct. The general rule is that the folding function should have one additional argument for each constructor of the data type where recursive types (here
For example for a list you have 2 constructors:
Node 1 [Node 2 [Node 3 []]]Then your folding function will only fold over 1 and 2, but not over 3.
If you have a recursive structure like this, a folding function over it must also be recursive. Otherwise it won't be able to traverse arbitrarily large recursive structure.
For the other question: If you specialize the folding function as
treeFold :: ([Char] -> [[Char]] -> [Char]) -> (Char -> [Char])
-> Tree Char -> [Char]by setting
b = [Char], you get what you're looking for - converting a Tree Char to String. You just need to supply the two function for folding, for exampletreeFold (\x ys -> x ++ concat ys) (: [])Update: The signature also isn't correct. The general rule is that the folding function should have one additional argument for each constructor of the data type where recursive types (here
Tree a) are replaced by the result of the fold:treeFold :: (a -> [b] -> b) -> Tree a -> bFor example for a list you have 2 constructors:
(:) :: a -> [a] -> [a] and [] :: [a], so its folding function isfoldr :: (a -> b -> b) -> b -> [a] -> bCode Snippets
Node 1 [Node 2 [Node 3 []]]treeFold :: ([Char] -> [[Char]] -> [Char]) -> (Char -> [Char])
-> Tree Char -> [Char]treeFold (\x ys -> x ++ concat ys) (: [])treeFold :: (a -> [b] -> b) -> Tree a -> bfoldr :: (a -> b -> b) -> b -> [a] -> bContext
StackExchange Code Review Q#69691, answer score: 2
Revisions (0)
No revisions yet.