Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
在Heist模板中使用postgresql simple的结果_Postgresql_Haskell_Heist - Fatal编程技术网

在Heist模板中使用postgresql simple的结果

在Heist模板中使用postgresql simple的结果,postgresql,haskell,heist,Postgresql,Haskell,Heist,我试图把这个和这个结合起来 我试着做了不同的变化。 拼接::C.拼接IO 拼接=do 项目您可能想要更像这样的项目: splice = do C.manyWithSplices C.runChildren projectSplices $ lift $ query_ "SELECT * FROM projects" where projectSplices = do "title" ## (C.pureSplice . C.textSplice $ tit

我试图把这个和这个结合起来

我试着做了不同的变化。

拼接::C.拼接IO
拼接=do

项目您可能想要更像这样的项目:

splice = do
  C.manyWithSplices C.runChildren projectSplices $ 
    lift $ query_ "SELECT * FROM projects"
  where
    projectSplices = do
      "title" ## (C.pureSplice . C.textSplice $ title)
      "description" ## (C.pureSplice . C.textSplice $ description)
这里的关键是理解类型。让我们对上述结构稍加注释:

splice :: Monad n => Splice n
splice = do
  foo
  C.manyWithSplices C.runChildren projectSplices $ do
    bar
    lift baz
符号foo的类型与
splice
splice n
的类型相同,相当于
HeistT n IO Blah
Blah
的细节对于当前的讨论并不重要。如果您查找
manyWithSplices
的类型签名,您将看到它返回
Splice n
,到目前为止,一切看起来都很好。您似乎有
runChildren
projectspaites
正确,因此让我们关注
manyWithSpaites
的第三个参数。再次参考API文档,我们看到第三个参数的类型为
RuntimeSplice n[a]
,因此这是
bar
必须具有的类型。但是这是什么
RuntimeSplice
东西呢。如果您在API文档中单击它,您将看到它有一个MonadTrans类型类的实例。如果你点击它,你会看到
MonadTrans
只定义了一个函数,
lift
,这正是我们在这里使用的。将
lift
的类型签名与我们已经得出的结论相结合,我们得出结论认为
baz
具有类型
n[a]


n
是您的运行时monad,
HeistT n IO
是您的加载时间monad。如果您在类似Janrain教程的Snap web应用程序环境中工作,那么在您的情况下,
n
将是
Handler b
。您指定了类型签名
Splice IO
,该签名在您的问题上下文中不起作用,因为IO不是正确的单子。

Haskell在事后总是显得如此明显。这就是让我走上正轨所需要的。关于你的编辑:最后三个函数可能是不必要的。只需使用模块
Snap.Snaplet.Heist
中的
cRender
即可获得要附加到路由的处理程序。当然,您必须在初始化阶段使用类似于
Snap.Snaplet.Heist
addConfig
注册拼接。(如果您使用
heistServe
也可以省略
cRender
,因为模板的名称是从路径推导出来的。)您是对的。这帮助我简化了一些代码。谢谢
projectSplice = do
  "title" ## (C.pureSplice . C.textSplice $ title)
  "description" ## (C.pureSplice . C.textSplice $ description)

splice :: C.Splice (Handler App App)
splice =  C.manyWithSplices C.runChildren projectSplice $ lift $ query_ "SELECT * FROM projects"

getHeistState heistConfig = liftIO $ either (error "Heist Init failed") id <$> (runEitherT $ initHeist heistConfig)

getBuilder heistState = maybe (error "Render template failed") fst $ C.renderTemplate heistState "database"

getAllProjectsHeist :: Handler App App ()
getAllProjectsHeist = do
  let heistConfig = HeistConfig defaultInterpretedSplices defaultLoadTimeSplices ("project" ## splice) noSplices [loadTemplates "templates"]
  heistState <- getHeistState heistConfig
  builder <- getBuilder heistState
  writeBS $ toByteString builder
splice = do
  C.manyWithSplices C.runChildren projectSplices $ 
    lift $ query_ "SELECT * FROM projects"
  where
    projectSplices = do
      "title" ## (C.pureSplice . C.textSplice $ title)
      "description" ## (C.pureSplice . C.textSplice $ description)
splice :: Monad n => Splice n
splice = do
  foo
  C.manyWithSplices C.runChildren projectSplices $ do
    bar
    lift baz