I use a simple hand-rolled monad to construct a response, which handles threading state and accessing the DB. It’s similar to the one described in “Build Your Own Haskell Web Framework on WAI” https://broch.io/posts/build-your-own-wai-framework/
I love the ease of deploying a single small binary. No worries about maintaining a remote language environment and ensuring parity, installing dependencies, and running a Git server just to deploy a new version. And it’s more secure than downloading and running packages from NPM or gems or whatever on the application server.