From: Ramakrishnan Muthukrishnan Date: Fri, 26 Dec 2014 07:57:50 +0000 (+0530) Subject: treeFold: two very different implementations. X-Git-Url: https://git.rkrishnan.org/components/com_hotproperty/%5B%5E?a=commitdiff_plain;h=dbc223294a39c4881109352f8c420e1917173824;p=yorgey.git treeFold: two very different implementations. --- diff --git a/hw8/Party.hs b/hw8/Party.hs index 180e45a..2a5cf79 100644 --- a/hw8/Party.hs +++ b/hw8/Party.hs @@ -3,6 +3,7 @@ module Party where import Data.Monoid import Employee +import Data.Tree -- exercise 1 -- glCons - a naive way to add an employee to a guest list @@ -18,3 +19,23 @@ instance Monoid GuestList where moreFun :: GuestList -> GuestList -> GuestList moreFun g1@(GL _ f1) g2@(GL _ f2) | f1 > f2 = g1 | otherwise = g2 + +-- treeFold :: (Tree a -> b -> b) -> b -> Tree a -> b +-- treeFold combine e= treeDestructor e f +-- where f _ ts = let vs = map (\t1 -> treeFold combine e t1) ts in +-- foldr (\acc v -> combine v acc) e vs +-- treeDestructor _ f1 t1 = case t1 of +-- (Node v xs) -> f1 v xs + + +-- treeFold :: (t1 -> [b] -> b) -> Tree t1 -> b +-- treeFold combine = treeDestructor f +-- where f v ts = let vs = map (\t -> treeFold combine t) ts in +-- combine v vs +-- treeDestructor f1 t1 = case t1 of +-- (Node v xs) -> f1 v xs +treeFold :: (b -> a -> b) -> b -> Tree a -> b +treeFold f e (Node v []) = f e v +treeFold f e (Node v ts) = let b = foldr (\t acc -> treeFold f acc t) e ts + in + f b v