Понимание простого haskell примера SpockM, кто возвращает монаду `SpockM`? - PullRequest
0 голосов
/ 13 февраля 2020

Это пример 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, один перед другим.

...