Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 是否在snaplet初始化期间使用subsnaplet?_Haskell_Haskell Snap Framework - Fatal编程技术网

Haskell 是否在snaplet初始化期间使用subsnaplet?

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

我有一些像这样的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 = 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来完成这一任务。文档中有一个小的代码片段