2012-11-30 65 views
9

Tôi đang thử Yesod các ví dụ về sách được ghi trên trang web Yesod. Một trong các ví dụ là dành cho Chat application embedded in Wiki. Khi tôi thử nó trong ghci (tải Chat mô-đun từ Wiki.hs chứa Wiki mã ví dụ), tôi nhận được báo lỗi dưới đây cho Chat.hs:Lỗi biên dịch khi thử một số ví dụ về Yesod

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) [])), 
     ....]' 

Tôi không phải là rất quen thuộc với các thư viện Yesod được nêu ra. Vì vậy, tôi stumped bởi các lỗi trên - Tôi đã nhìn thấy lỗi này trong ví dụ khác Yesod quá nơi toWidget chức năng được gọi là. Vì vậy, nó có vẻ liên quan đến chức năng toWidget. Tôi sẽ đánh giá cao sự giúp đỡ trong việc sửa lỗi trên.

Tôi đang sử dụng ghc 7.6.1 với yesod 1.1.4.1.

Cập nhật:

Cố định sau đây gợi ý Hammar của. Tôi đã thực hiện hai thay đổi trong Chat.hs.

  1. tuyên bố nhập khẩu Add cho rawJS:

    import Text.Julius (rawJS)

  2. Theo dõi xuống tất cả các trường hợp của # {} khối trong julius whamlet trong Chat.hs, và thay thế chúng với {# rawJS ...}

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

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

Trả lời

12

Tôi chưa cài đặt Yesod để thử nghiệm tại thời điểm này, nhưng theo this blog post bạn chỉ cần thay đổi #{output} thành #{rawJS output} và cứ như vậy khi nội suy số nhận dạng JavaScript.

+0

cảm ơn bạn, @hammar. Đó chính là vấn đề. Đã sửa lỗi ngay sau khi tôi theo dõi từng khối # {} bên trong julius whamlet và thay thế nó bằng rawJS. – Sal

5

Trong shakespeare-js-1.1.0, các ToJavascript trường cho Text và một số loại khác đã được loại bỏ:

-- | 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 

trong khi ở các phiên bản trước của gói, họ chỉ có điều kiện khuyết tật:

#ifndef SAFER_INTERPOLATION 

Tôi không biết liệu đó là cố ý và có nghĩa là để duy trì như vậy, hoặc chỉ là một sự thay đổi phát triển bị lãng quên.

Để sử dụng ví dụ như hiện tại, bạn cần phải xây dựng lại yesod với shakespeare-js < 1.1. Điều đó có nghĩa là gỡ bỏ rất nhiều gói đầu tiên, hoặc một sandbox mới (nếu bạn đang sử dụng cabal-dev hoặc một số công cụ sandboxing khác).

Các trường hợp duy nhất của ToJavascript trong shakespeare-js-1.1.0RawJavascript (một wrapper newtype xung quanh Builder) và Value (một loại cho các giá trị JSON) từ gói aeson.

Bạn chỉ có thể quấn output trong

Text.Julius.toJavascript output 

trong một RawJavascript . Data.Text.Lazy.Builder.fromText để có được một giá trị RawJavascript và làm cho nó có tác dụng nếu nó là mã thực, nhưng vì nó là TH-tạo ra, bạn cần phải sửa chữa các TH đầu ra hoặc quasiquoter - không phải thứ mà tôi biết cách làm.

+0

Cảm ơn @ daniel-fischer. Thật vậy, rawJS đã mất tích như Hammar đã chỉ ra. – Sal

Các vấn đề liên quan