普段はFlask使ってるし、NodeでWebアプリ使う時にはExpressを使うので、これ以上Sinatraクローンを覚えたいとは思わないが、ソースコードを読んで勉強するにはちょうどいいサイズだった。
newtype ActionM a = AM { runAM :: ErrorT ActionError (ReaderT ActionEnv (StateT Response IO)) a } deriving ( Monad, MonadIO, Functor , MonadReader ActionEnv, MonadState Response, MonadError ActionError)
モナド変換子の重ね方が参考になった。Scottyの場合はErroTでリダイレクトとかの処理をするようになっている。
defaultHandler :: ActionError -> ActionM () defaultHandler (Redirect url) = do status status302 header "Location" url defaultHandler (ActionError msg) = do status status500 html $ mconcat ["<h1>500 Internal Server Error</h1>", msg] defaultHandler Next = next
参考
括弧が省略できてインデントでネストが表現できる言語だとコードの見通しが良くていいですね。
{-# LANGUAGE OverloadedStrings #-} import Web.Scotty import Data.Monoid main :: IO () main = scotty 3000 $ do get "/" $ text "Helllo Scotty" get "/lang" $ do v <- param "type" html $ mconcat ["<h1>", v, "</h1>"]