data Tree a = Node (Tree a) a (Tree a) | Leaf data A f = A1 (f ()) | A2 (f (Tree ())) data Either a b = Left a | Right b data ExceptT e m a = ExceptT (Either e (m a)) data TreeF a r = NodeF r a r | LeafF data Fix f = In (f (Fix f)) data Tree' a = Tree' (Fix (TreeF a))