I find it helpful to have ghci tell me about the types in the code I am reading. Here is a snip of ghci output.
*Main>:i simpleHTTP
simpleHTTP :: (ToMessage a) => Conf -> [ServerPartT IO a] -> IO ()
-- Defined in HAppS.Server.SimpleHTTP
*Main>:i Conf
data Conf = Conf {port :: Int}
-- Defined in HAppS.Server.HTTP.Types
*Main> :i ServerPartT
newtype ServerPartT m a
= ServerPartT {unServerPartT :: Request -> WebT m a}
-- Defined in HAppS.Server.SimpleHTTP
instance [overlap ok] (Monad m) => Monad (ServerPartT m)
-- Defined in HAppS.Server.SimpleHTTP
*Main> :i WebT
newtype WebT m a = WebT {unWebT :: m (Result a)}
-- Defined in HAppS.Server.SimpleHTTP
instance [overlap ok] (Monad m) => Monad (WebT m)
-- Defined in HAppS.Server.SimpleHTTP
So basically what this tells you is that the meat of a HAppS application is a list of ServerParts, which themselves are a wrapper over a function that takes an HTTP request to a response.
I use ghci info a lot, and you should too as you are learning HAppS. This kind of comfort with the HAppS type system is particularly important at the present time, when the HAppS documentation is relatively sparse
HAppsTutorial2 at the haskell wiki has a more in-depth look at thinking behind HAppS and the HAppS type system.