foldrTree :: (a -> b -> b) -> b -> InternalTree a -> b foldrTree f z ILeaf = z foldrTree f z (IBranch a x y) = foldrTree f (f a (foldrTree f z y)) x foldlTree :: (a -> b -> a) -> a -> InternalTree b -> a foldlTree f z ILeaf = z foldlTree f z (IBranch a x y) = foldlTree f (f (foldlTree f z x) a) y repeatTree :: a -> InternalTree a repeatTree a = t where t = (IBranch a (t) (t)) |

`repeatTree` is apparently magic: the base case constructor (`ILeaf`) is not specified. But the `takeTree` and `takeTreeWhile` functions work with `repeatTree` as expected.

(Technical error 14 applies to this exercise.)

Hi, repeatTree is no magic. I thought it as well first but look at definitions of takeTree and takeTreeWhile, pattern can actually match IBranch but returns ILeaf.

takeTree :: Int -> InternalTree a -> InternalTree a

takeTree 0 t = ILeaf — LOOK AT THIS

takeTree n ILeaf = ILeaf

takeTree n (IBranch a x y) = IBranch a (takeTree (n-1) x) (takeTree (n-1) y)

takeTreeWhile :: (a -> Bool) -> InternalTree a -> InternalTree a

takeTreeWhile f ILeaf = ILeaf

takeTreeWhile f (IBranch a x y) = if (f a)

then IBranch a (takeTreeWhile f x)

(takeTreeWhile f y)

else ILeaf — LOOK AT THIS