J'ai le code ci-dessous, extrait de here:Utilisation de ReaderT et runReaderT avec SQLite?
type Blog a = ReaderT SQLiteHandle IO a
data BlogDBException = BlogDBException String deriving (Show, Typeable)
instance Exception BlogDBException
run :: Blog a -> IO a
run m = do
db <- openConnection "myblog.db"
runReaderT m db --runReaderT :: ReaderT r m a -> (r -> m a)
sql :: String -> Blog (Either String[[Row Value]])
sql query = do
db <- ask --ask :: Monad m => ReaderT r m r
liftIO $ do
putStrLn query
execStatement db query
dbQuery :: Blog [Int]
dbQuery = do
r <- sql "select UID from UIDS;"
case r of
Right [rows] -> return [fromIntegral uid | [(_, Int uid)] <- rows]
Left s -> liftIO $ throwIO (BlogDBException s)
_ -> liftIO $ throwIO (BlogDBException "Invalid result")
J'essaie de comprendre
1) le rôle exact de readerT
dans data Blog a
?
2) exactement ce que runReaderT
fait ici?
3) comment fonctionne la fonction ask
?
Quelqu'un at-il une explication simple? C'est la première fois que je travaille avec la monade Reader
.