Я использовал servant-generic-0.1.0.3
и servant-server-0.13.0.1
, чтобы сделать следующее:
data Site route = Site
{ page :: route :-
"page" :> Capture "x" Int :> Capture "y" Int :> Get '[JSON] [Int]
, home :: route :-
Raw
} deriving (Generic)
type API = ToServant (Site AsApi)
siteServer :: Pool Connection -> Site AsServer
siteServer pool = Site
{ page = \x y ->
liftIO $ withResource pool $ \conn -> someDbFunction conn x y
, home = serveDirectoryWebApp "static"
}
api :: Proxy API
api = Proxy
app :: Pool Connection -> Application
app pool = serve api (toServant $ siteServer pool)
Это работало нормально, затем я попытался использовать ReaderT
, чтобы избежать передачи Pool Connection
в siteServer
, поэтому я добавил AppM
и заменил siteServer
следующим образом:
type AppM = ReaderT (Pool Connection) IO
siteServer :: ServerT API AppM
siteServer = Site
{ page = do
pool <- ask
\x y ->
liftIO $ withResource pool $ \conn -> someDbFunction conn x y
, home = serveDirectoryWebApp "static"
}
но я получил кучу ошибок, когда пытался его скомпилировать.
Я выполнил те же действия, что и в поваренной книге серванта., но мне не удалось заставить это работать с общими маршрутами, хотя это работает при использовании обычных маршрутов.
Я пропустил что-то, что могло бы заставить эту работу работать?
servant-generic
был объединен сservant-0.14
, а API немного изменился. Так что помните об этом, когда будете подниматьservant
версию. - person Shersh   schedule 22.07.2018