鉴于我的 Haskell 学习项目的最后一行:
writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet"))
我想将输出hamletFile
的签名转换为:
FilePath -> Q Exp
进入renderHtml
函数期望的 Html 类型。
*我对我目前正在做的事情的上述断言很有可能是完全错误的!
鉴于我的 Haskell 学习项目的最后一行:
writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet"))
我想将输出hamletFile
的签名转换为:
FilePath -> Q Exp
进入renderHtml
函数期望的 Html 类型。
*我对我目前正在做的事情的上述断言很有可能是完全错误的!
你已经很接近让这个工作了。正如 Bartek 和 MathematicalOrchid 都说的,hamletFile "fileList.hamlet"
has type Q Exp
,这意味着“GHC 可以运行它来生成表达式”。通过将其包装在 中$(...)
,您是在说“GHC,请生成一个表达式。” 你需要问它的下一个问题:这个生成的表达式的类型是什么?
您可以在 Yesod book 的莎士比亚章节中获得更多信息,但表达式将具有以下类型:
(url -> [(Text, Text)] -> Text) -> Html
这基本上意味着“告诉我如何将 URL 和一些查询字符串参数转换为文本,我会给你一些 HTML。” 如果您没有在模板中使用任何类型安全的 URL,您可以简单地提供undefined
(或切换到使用shamletFile
,请参阅本章了解更多信息)。
一旦你提供了 URL 渲染功能,你就可以使用renderHtml
你的懒惰严格并从那里继续。
感谢上面的答案和一些外部帮助,我的工作代码变成了:
writeText $ TL.toStrict (renderHtml ($(hamletFile "fileList.hamlet") "HTML"))
并且需要添加{-# LANGUAGE TemplateHaskell #-}
到脚本的顶部(似乎与使用 Template Haskell 的复杂性有关)。
基本上,该表达式的$(hamletFile "fileList.hamlet")
意思是“在编译时执行此函数调用以从 Haskell 源代码生成”。我不知道它生成了什么确切的代码。
我不知道哈姆雷特,但可能有一些方法可以让它在运行时而不是编译时进行这种翻译——这可能就是你想要的。