Haskell Requires Perfection "When There is Nothing More To Take Away"
With Haskell perfection is not optional, but required. Otherwise one ends up deep into redundant abstract bullshit, unnecessary wrapping mess, which would be even worse than J2EE bullshit.
Another great example is brevity of speech of smart autistic people compared to verbal diarrhea of intelligence cosplaying imposers.
Dalai Lama speaks a few sentences at a time, but these are well though, have no redundancy no decoration and no long words to impress idiots.
This is precisely how Haskell code must be written - Just Right (the Buddha's principle) or the principle of Antoine de Saint-Exupéry: Perfection is achieved when there is nothing more to take away (which is implied in Buddha's Just Right).
The modern mantra for that is Data Dominates, which means that after finding the most appropriate (Just Right) data structures, the algorithms and the code (implementation) just follow.
For Haskell the mantra is Just Right Types, and everything else follows. It must be explicitly said - The most straightforward, down-to-earth types, such as Sequences, Trees, Tables (
Foldable, etc), NOT Free Monads and similar stuff.
Monads is just a convenient formal conceptual framework to enforce an abstraction barrier for a declarative (pure functional) language. No more, no less. Explicit order of evaluation is enforced by function call nesting, which is at the core of Monads (and Arrows) implementation.
Kleisli categories and stuff is just an abstract framework which provided an insight of how a barrier could be generalized.