【发布时间】: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