Это пример Hello World для Спока из здесь .
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Web.Spock
import Web.Spock.Config
import Control.Monad.Trans
import Data.IORef
import Data.Monoid
import qualified Data.Text as T
data MySession = EmptySession
data MyAppState = DummyAppState (IORef Int)
main :: IO ()
main =
do ref <- newIORef 0
spockCfg <- defaultSpockCfg EmptySession PCNoDatabase (DummyAppState ref)
runSpock 8080 (spock spockCfg app)
app :: SpockM () MySession MyAppState ()
app =
do get root $
text "Hello World!"
get ("hello" <//> var) $ \name ->
do (DummyAppState ref) <- getState
visitorNumber <- liftIO $ atomicModifyIORef' ref $ \i -> (i+1, i+1)
text ("Hello " <> name <> ", you are visitor number " <> T.pack (show visitorNumber))
Функция app
разрешает монаду SpockM () MySession MyAppState ()
. Я понимаю, что в определении app
я могу использовать множество вызовов get
и, возможно, post
, et c, для создания своих конечных точек API. Однако я не вижу, какая часть кода возвращает монаду SpockM
. Как «состав» из нескольких get
«вернуть» SpockM
? Если бы это был один get
, я бы предположил, что он возвращает SpockM
, но он использовал несколько get
s, один перед другим.