1. Ability to quickly translate programs into other programs meaning transforming one set of values on an ADT (sealed classes) to another and therfore transforming a language into another.
2. Stack safety by default because on interpretation
foldMap
reduces the free structure by calling
Monad#tailRecM
which is a contract in which by every monad guarantees that you can flatMap in a stack safe way