Sto giocando con la scrittura di un'app web. In questo caso, sto usando scotty e redis, ma questo problema si presenta in qualsiasi combinazione web/db. Ho usato happstack prima di questo, quindi mi piacerebbe un esempio anche lì.Combina due monadi quando nessuno dei due ha un trasformatore?
Scotty ha definirebbe percorsi in una monade nidificato, che lo rende facile per accedere alla connessione al database all'interno di un percorso:
main = do
db <- connect defaultConnectInfo
scotty 3000 $ do
get "/keys" $ do
keys <- liftIO $ runRedis db $ keys "*"
html $ T.pack $ show keys
il fai blocco get è di tipo: Web.Scotty.ActionM()
. Tutti i comandi redis hanno tipo Database.Redis.Redis a
. Né redis o scotty ha un trasformatore monade.
Qual è il modo migliore per combinarli? Sono nuovo di haskell, ma sono riuscito a far funzionare ReaderT con la web monad in happstack.
Idealmente, potrei in qualche modo creare un nuovo stack monad che supporti sia keys
e html
nello stesso blocco di operazioni.
Normalmente le persone si accontentano di liftIO nei framework web haskell? –
Non conosco una risposta qui, ma immagino che il tuo problema sia simile ai trasformatori monad. Fondamentalmente, vuoi implementare un tipo, chiamiamolo 'IdentityTT m 'ma', in modo che' IdentityTT m'' si comporti esattamente come ['IdentityT'] (http://hackage.haskell.org/packages/archive/transformers /0.2.1.0/doc/html/Control-Monad-Trans-Identity.html). La prima domanda a cui rispondere, ovviamente, è se ciò è possibile. –
Un altro modo per esprimere la domanda è: usi liftIO per interrogare un database in tutti i framework haskell? Qual è lo schema più comune quando il database non viene inserito nel framework? –