Using MySQL with Wai and Warp I was wondering if below is the correct convention for combining Wai with a Database pool.

What I basically do is, create a pool, partially apply a function of type Pool -&gt; Application and use it to pass it to Warp's run. Does it look ok, or shall I refactor it?

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Database.MySQL.Simple
import Data.Pool (Pool, createPool, withResource)

newConn = connect defaultConnectInfo 
    { connectHost = "db"
    , connectUser = "root"
    , connectPassword = "secret"
    , connectDatabase = "test" }

getPool = createPool newConn close 1 10 5

app :: Pool Connection -&gt; Application
app pool _ respond = do
    withResource pool $ \c -&gt; query_ c "SELECT 1" :: IO [Only Int]
    respond $ responseLBS
        status200
        [("Content-Type", "text/plain")]
        "Hello, Web!"

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    pool &lt;- getPool
    run 8080 $ app $ pool
I'm afraid there isn't much to remove. The $ after putStrLn and between app and pool are superfluous. You could write the last two lines run 8080 . app &lt;$&gt; getPool. I'd inline getPool. You may be interested in https://github.com/alevy/simple/blob/master/simple/src/Web/Simple.hs#L134 for boilerplate reduction.