【问题标题】:Working with Hamletfile's Q Exp return value使用 Hamletfile 的 Q Exp 返回值
【发布时间】:2014-09-03 10:46:22
【问题描述】:

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

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

我想转换来自hamletFilesignature的输出:

FilePath -> Q Exp

转换为renderHtml 函数所期望的 Html 类型。

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

【问题讨论】:

  • Q 是一个模板 haskell 类型。我猜你需要以某种方式扩展它。

标签: haskell haskell-snap-framework hamlet


【解决方案1】:

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

您可以在shakespeare chapter of the Yesod book 中获取更多信息,但表达式将具有类型:

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

这基本上意味着“告诉我如何将 URL 和一些查询字符串参数转换为文本,我会给你一些 HTML。”如果您没有在模板中使用任何类型安全的 URL,您可以简单地提供 undefined(或切换到使用 shamletFile,有关详细信息,请参阅本章)。

提供 URL 渲染功能后,您可以使用 renderHtml 获取您的惰性严格并从那里继续。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 2019-04-01
        • 2016-03-18
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        相关资源
        最近更新 更多