鉴于my Haskell learning project中的最后一行:
writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet"))
我想转换hamletFile
的{{3}}的输出:
FilePath -> Q Exp
进入renderHtml
函数预期的Html类型。
*我在上述关于我目前正在做的事情的断言中,我完全错了!
答案 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的复杂性有关,似乎)。