在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