1

鉴于我的 Haskell 学习项目的最后一行:

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

我想将输出hamletFile签名转换为:

FilePath -> Q Exp

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

*我对我目前正在做的事情的上述断言很有可能是完全错误的!

4

3 回答 3

2

你已经很接近让这个工作了。正如 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你的懒惰严格并从那里继续。

于 2014-09-03T15:12:22.400 回答
1

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

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

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

于 2014-09-03T19:02:19.277 回答
1

基本上,该表达式的$(hamletFile "fileList.hamlet")意思是“在编译时执行此函数调用以从 Haskell 源代码生成”。我不知道它生成了什么确切的代码。

我不知道哈姆雷特,但可能有一些方法可以让它在运行时而不是编译时进行这种翻译——这可能就是你想要的。

于 2014-09-03T12:03:53.290 回答