Haskell 是否在snaplet初始化期间使用subsnaplet?
我有一些像这样的snaplet:Haskell 是否在snaplet初始化期间使用subsnaplet?,haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,我有一些像这样的snaplet: data DB b = DB {_pgsql :: Snaplet Postgresql ,dbCache :: Map Text Text } initDB :: SnapletInit b (DB b) initDB = makeSnaplet "db" "cached database" Nothing $ do pgs <- nestSnaplet "pgsql" pgsql pgsInit let pool = pg
data DB b = DB
{_pgsql :: Snaplet Postgresql
,dbCache :: Map Text Text
}
initDB :: SnapletInit b (DB b)
initDB = makeSnaplet "db" "cached database" Nothing $ do
pgs <- nestSnaplet "pgsql" pgsql pgsInit
let pool = pgPool $ extract pgs
results <- liftIO $ withResource pool (\conn -> query_ conn myQuery)
我希望从postgresql数据库中填充dbCache
。似乎在snaplet初始化期间这样做是很自然的
initDB :: SnapletInit b (DB b)
initDB = makeSnaplet "db" "cached database" Nothing $ do
pgs <- nestSnaplet "pgsql" pgsql pgsInit
cache <- getSomeDataPlease pgs
return $ DB pgs cache
initDB::SnapletInit b(DB b)
initDB=makeSnaplet“db”“cached database”Nothing$do
pgssnaplet postgresql simple提供的DB访问函数在作为HasPostgres
type类实例的任何monad中运行。通常,这将是应用程序的处理程序monad
不能在初始值设定项中使用处理程序
函数。初始化器monad的全部要点是设置运行web服务器和处理程序monad所需的初始状态数据类型。所以在初始值设定项中运行处理程序确实是不可能的——当然,除非您是从另一个web服务器中运行一个web服务器
所以你有两个可能的选择。您可以为您的初始值设定项创建一个HasPostgres
实例。但是,除非连接到静态服务器,否则这没有多大意义。如果您正在进行调试,这可能是可以接受的。有时我会对IO执行此操作,以使测试数据库功能变得简单:
instance HasPostgres IO where
getPostgresState = do
pool <- createPool (connect $ ConnectInfo "127.0.0.1" ...) ...
return $ Postgres pool
您可以在snaplet postgresql simple中看到一个真实的示例
更新:
我刚刚上传了snaplet postgresql simple to hackage的新版本,该版本提供了。这使您可以更简单地使用runReaderT来完成这一任务。文档中有一个小的代码片段