尝试一些Yesod示例时编译错误

Sal*_*Sal 9 haskell yesod

我正在尝试Yesod在Yesod网页上记录的书籍示例.其中一个示例是Wiki中嵌入的聊天应用程序.当我在ghci(加载Chat模块,Wiki.hs其中包含Wiki示例代码)中尝试它时,我得到以下关于Chat.hs的错误:

Chat.hs:122:34:
    Could not deduce (Text.Julius.ToJavascript Text)
      arising from a use of `Text.Julius.toJavascript'
    from the context (YesodChat master)
      bound by the type signature for
                 chatWidget :: YesodChat master =>
                               (Route Chat -> Route master) -> GWidget sub master ()
      at Chat.hs:(81,15)-(83,35)
    Possible fix:
      add an instance declaration for (Text.Julius.ToJavascript Text)
    In the first argument of `Text.Julius.Javascript', namely
      `Text.Julius.toJavascript output'
    In the expression:
      Text.Julius.Javascript (Text.Julius.toJavascript output)
    In the first argument of `Data.Monoid.mconcat', namely
      `[Text.Julius.Javascript
          ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')
             "\
             \// Set up the receiving end\
             \var output = document.getElementById(\""),
        Text.Julius.Javascript (Text.Julius.toJavascript output),
        Text.Julius.Javascript
          ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')
             "\");\
             \var src = new EventSource(\""),
        Text.Julius.Javascript
          (Data.Text.Lazy.Builder.fromText
             (_render_a3Yr (toMaster ReceiveR) [])),
        ....]'
Run Code Online (Sandbox Code Playgroud)

我对Yesod库还不是很熟悉.所以,我被上面的错误所困扰 - 我在其他Yesod示例中也看到了这个错误,其中toWidget函数被调用.所以,它似乎与toWidget功能有关.我将非常感谢帮助修复上述错误.

我使用ghc 7.6.1yesod 1.1.4.1.

更新:

修正了Hammar的建议.我做了两处改动Chat.hs.

  1. 为rawJS添加import语句:

    import Text.Julius (rawJS)

  2. 内追查#{}块的所有实例julius whamletChat.hs,并用它们替换{# rawJS ...}

    var output = document.getElementById("#{rawJS output}");

    var input = document.getElementById("#{rawJS input}");

ham*_*mar 12

我目前没有安装Yesod来测试它,但是根据这篇博文,你只需要在插入JavaScript标识符时#{output}改为#{rawJS output}等等.


Dan*_*her 5

shakespeare-js-1.1.0,已删除ToJavascript实例Text和一些其他类型:

-- | A typeclass for types that can be interpolated in CoffeeScript templates.
class ToJavascript a where
    toJavascript :: a -> Builder
#if 0
instance ToJavascript [Char] where toJavascript = fromLazyText . TL.pack
instance ToJavascript TS.Text where toJavascript = fromText
instance ToJavascript TL.Text where toJavascript = fromLazyText
instance ToJavascript Javascript where toJavascript = unJavascript
instance ToJavascript Builder where toJavascript = id
#endif
instance ToJavascript Value where toJavascript = fromValue
Run Code Online (Sandbox Code Playgroud)

而在以前版本的软件包中,它们只是有条件地禁用:

#ifndef SAFER_INTERPOLATION
Run Code Online (Sandbox Code Playgroud)

我不知道这是故意还是意图保持这样,或者只是一个被遗忘的发展变化.

要按原样使用该示例,您需要重建yesod shakespeare-js < 1.1.这意味着首先要卸载很多软件包,或者新的沙箱(如果你使用的是cabal-dev或其他一些沙盒工具).

ToJavascriptin 的唯一实例shakespeare-js-1.1.0RawJavascript(newtype包装Builder)和Value(包含JSON值的类型)aeson.

你可以只包output

Text.Julius.toJavascript output
Run Code Online (Sandbox Code Playgroud)

在a RawJavascript . Data.Text.Lazy.Builder.fromText中得到一个RawJavascript值并使其工作如果它是真正的代码,但由于它是TH生成的,你需要修复TH输出或quasiquoter - 我都不知道该怎么做.