to have monads is to compromise functional programming.
How so? If anything, monads are one of the great success stories of (pure) functional programming.
There are lots of interesting monads which are literally useless in the presence of effects. For example, side-effects can:
Leak private references from the Single Thread monad, making its encapsulation useless.
Perform irreversible changes, making monads like Software Transactional Memory and Backtrack/Undo useless.
Enter infinite loops, making the Partial monad useless.
Break referential transparency, making Memoisation useless.