It seems that in many cases it's just easier to use >>= to recurse manually. What I want is m (a) -> f (m a) I guess this needs combinations of retact and lift to convert between the monad (tree) and the node (which possibly contains subtrees). What I want is to be able to do two different things based on whether something is a Pure or a Free node. Basic tree handling. How to do this?