Show HN: Servant – A Haskell web framework with type-level API DSL
haskell-servant.github.io
haskell-servant.github.io
Checking for correctness and deriving functionality from that comes pretty naturally after that, so it's easy to reduce boilerplate (e.g., generate client libraries and documentation automatically) and make static guarantees (e.g., that a link exists within an API, and won't 404).
[0] http://www.informatik.uni-marburg.de/~kos/papers/gpce06.pdf
You do get kind of used to it, though, for what it's worth. And you can always break things up. E.g.:
type MyAPI = "users" :> Get '[JSON] User
:<|> "users" :> ReqBody '[JSON] User :> Post '[] ()
Can generally be rewritten as: type GetUser = Get '[JSON] User
type PostUer = ReqBody '[JSON] User :> Post '[] ()
type MyAPI = "user" :> (GetUser :<|> PostUser)
etc.