Templates 如何在Yesod中导入莎士比亚模板?

Templates 如何在Yesod中导入莎士比亚模板?,templates,haskell,ghc,yesod,hamlet,Templates,Haskell,Ghc,Yesod,Hamlet,我在Yesod中使用了准旋转,一切正常。但是我的文件变得非常大,看起来不好看。此外,我的TextEditor没有正确突出显示此语法。这就是为什么像这样拆分我的文件: getHomeR :: Handler Html getHomeR = do webSockets chatApp defaultLayout $ do $(luciusFile "templates/chat.lucius") $(juliusFile "templates/chat

我在Yesod中使用了准旋转,一切正常。但是我的文件变得非常大,看起来不好看。此外,我的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(哈姆雷特)


因此,每个模板一个。

似乎
文件
和其他人将模板视为自包含的,而您的模板是相互引用的。您可以使用
*文件
调用的顺序,或使用
Yesod.Default.Util
模块中的
widgetFile*

$(widgetFileNoReload def "chat")

Reload
变量对开发非常有用-它将使
yesod-devel
监视文件更改并重新加载它们。

尝试使用标记编译或解释
-ddump拼接
-它将打印TH生成的代码(似乎生成的代码中存在错误)。潜在的
do
正在破坏它?试着不用它。你的代码看起来不错。尝试使用
$(widgetFile“chat”)
而不是三个单独的调用。@arrowd我刚开始试过这样做。它给出了一个“不在范围内:”错误。我必须导入widgetfile吗?我到底应该在哪里调用它呢?@Spacemoose
widgetFile
通常是在使用
yesod init
构建项目时创建的。如果是手动创建的,则需要使用
widgetFileReload
/
widgetFileNoReload
from
Yesod.Default.Util
。在你的do块中使用它来代替那三个调用。啊,对了。使用
(def::WidgetFileSettings)
作为其第一个参数。它在
数据中定义。默认值