data Tree a = Leaf a | Node a (Tree a) (Tree a) deriving (Eq,Show) data Id a = Id a instance Monad Id where (>>=) (Id x) f = f x return = Id genList :: (Eq a, Show a) => Tree a -> [a] -> Id [a] genList (Leaf l) names | contains names l = return names | otherwise = return (names ++ [l]) genList (Node n l r) names = do names2 <- genList (Leaf n) names names3 <- genList l names2 names4 <- genList r names3 return names4 contains :: (Eq a, Show a) => [a] -> a -> Bool contains [] x = False contains (y:ys) x | x == y = True | otherwise = contains ys x