{-# LANGUAGE ImpredicativeTypes #-} data Request data Response type Application = forall a. Request -> (Response -> IO a) -> IO a type Middleware = Application -> Application middleware1, middleware2, middleware3 :: Middleware middleware1 _ = undefined middleware2 _ = undefined middleware3 _ = undefined middlewares :: Middleware middlewares app = foldl' @[] @Application (flip ($)) app $ [ middleware1 , middleware2 , middleware3 ] main = pure ()