Drkcore

22 12 2012 Haskell Tweet

ScottyはHaskellのSinatraクローン

ScottyはHaskell版のSinatraですね。

普段は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>"]

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021