使用Hamletfile的Q Exp返回值

时间:2014-09-03 10:46:23

标签: haskell haskell-snap-framework hamlet

鉴于my Haskell learning project中的最后一行:

writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet")) 

我想转换hamletFile的{​​{3}}的输出:

FilePath -> Q Exp

进入renderHtml函数预期的Html类型。

*我在上述关于我目前正在做的事情的断言中,我完全错了!

3 个答案:

答案 0 :(得分:2)

你已经非常接近让这个工作了。正如Bartek和MathematicalOrchid都说的那样,hamletFile "fileList.hamlet"具有类型Q Exp,这意味着" GHC可以运行它来生成表达式。"通过将其包装在$(...)中,您说," GHC,请生成一个表达式。"您需要问下一个问题:这个生成的表达式的类型是什么?

您可以在shakespeare chapter of the Yesod book中获得更多信息,但表达式的类型为:

(url -> [(Text, Text)] -> Text) -> Html

这基本上意味着"告诉我如何将URL和一些查询字符串参数转换为文本,我会给你一些HTML。"如果您未在模板中使用任何类型安全的网址,则只需提供undefined(或切换为使用shamletFile,请参阅本章以获取更多信息。)

提供网址呈现功能后,您可以使用renderHtml获取懒惰严格,然后从那里继续。

答案 1 :(得分:1)

基本上,表达式$(hamletFile "fileList.hamlet")表示"在编译时执行此函数调用以从Haskell源代码"生成。它产生的确切代码我不知道。

我不认识哈姆雷特,但可能有某种方式要求它在运行时而不是编译时进行翻译 - 这可能就是你想要的。< / p>

答案 2 :(得分:1)

感谢上面的答案和一些外界的帮助,我的工作代码变成了:

writeText $ TL.toStrict (renderHtml ($(hamletFile "fileList.hamlet") "HTML"))

并且需要在脚本的顶部添加{-# LANGUAGE TemplateHaskell #-}(与使用模板Haskell的复杂性有关,似乎)。