【问题标题】:How to import Shakespearean Templates in Yesod?如何在 Yesod 中导入莎士比亚模板?
【发布时间】:2016-06-20 07:01:33
【问题描述】:

我在 Yesod 中使用 QuasiQuotations,一切正常。但是我的文件变得非常大,不好看。此外,我的 TextEditor 没有正确突出显示此语法。这就是为什么要像这样拆分我的文件:

getHomeR :: Handler Html
getHomeR = do
    webSockets chatApp
    defaultLayout $ do
        $(luciusFile "templates/chat.lucius")
        $(juliusFile "templates/chat.julius")
        $(hamletFile "templates/chat.hamlet")

如果这是错误的,请告诉。执行runghc myFile.hs 会引发许多这样的错误:

chat_new.hs:115:9:
    Couldn't match expected type ‘t0 -> Css’
                with actual type ‘WidgetT App IO a0’
    The lambda expression ‘\ _render_ajFK
                             -> (shakespeare-2.0.7:Text.Css.CssNoWhitespace . (foldr ($) ...))
                                  ...’
    has one argument,
    but its type ‘WidgetT App IO a0’ has none
    In a stmt of a 'do' block:
      \ _render_ajFK
      ...

还有这个。

chat_new.hs:116:9:
    Couldn't match type ‘(url0 -> [(Text, Text)] -> Text)
                         -> Javascript’
                   with ‘WidgetT App IO a1’
    Expected type: WidgetT App IO a1
      Actual type: JavascriptUrl url0
    Probable cause: ‘asJavascriptUrl’ is applied to too few arguments
    ...

还有一个用于 HTML (Hamlet)。

因此,每个模板一个。

【问题讨论】:

  • 尝试使用标志-ddump-splices 进行编译或解释-它将打印由 TH 生成的代码(似乎错误在生成的代码中)。 do 可能会破坏它?尝试不使用它。
  • 您的代码看起来不错。尝试使用 $(widgetFile "chat") 而不是三个单独的调用。
  • @arrowd 我一开始就尝试过这样做。它给出了“不在范围内:”错误。我必须导入小部件文件吗?我到底要在哪里称呼它?
  • @Spacemoose widgetFile 通常是在您使用yesod init 搭建项目时创建的。如果是手动创建的,则需要使用Yesod.Default.Util 中的widgetFileReload/widgetFileNoReload。在你的 do-block 中使用它来代替这三个调用。
  • 啊,对。使用(def :: WidgetFileSettings) 作为它的第一个参数。它在Data.Default中定义。

标签: templates haskell ghc yesod hamlet


【解决方案1】:

似乎hamletFile 和其他人将模板视为独立的,而您的模板则相互引用。您可以使用*File 调用的顺序,或者使用Yesod.Default.Util 模块中的widgetFile*

$(widgetFileNoReload def "chat")

Reload 变体对开发很有用 - 它会让yesod devel 监视文件更改并重新加载它们。

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2014-03-15
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多