I think you are conflating Yesod/Persistent with the Haskell environment.
The normal approach in Haskell is to have a bag of one or two dozen libraries that you use as base building blocks for your specific problem, think Lego.
There are no full-fledged “frameworks” because Haskell developers don’t think that way.
You use Servant/Spock/… for routing, Wai for building/combining webapplications, Warp as webserver, postgres-simple as database layer, maybe some FRP library to react to events, validation to do server-side validation (in a general way), monad transformer stacks to create local side-effecting environments, lenses to access/modify deep datastructures, blaze to construct html, errors to help with error/exception handling, conduit/pipes to stream data through your application, parser combinators to build small parsers, …
It may be a lot to take in and a framework surely feels safer, but frameworks are not how Haskell unfolds all of its potential.
Of course it’s totally valid to start with a nicely documented solution, but (probably) all of the problems you listed here have already been solved by a library and are only waiting to be discovered in order to be added to that bag of lego blocks.