2012-11-30 14 views
9

Yesod web sayfasında belgelenen Yesod kitap örneklerini deniyorum. Örneklerden biri Chat application embedded in Wiki içindir. Ben (Wiki örneği kodunu içeren Wiki.hs den Chat modülü yüklenirken) GHCi bunu çalıştığımda, Chat.hs için aşağıdaki hatayı alıyorum:Bazı Yesod örneklerini çalışırken hata derleme

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

Henüz Yesod'dan kütüphaneleri ile çok aşina değilim. Yani, yukarıdaki hataya göre stumped - Bu hatayı diğer Yesod örneklerinde de gördüm, burada toWidget işlevi çağrıldı. Yani, toWidget işlevi ile ilgili gibi görünüyor. Yukarıdaki hatayı düzeltmedeki yardımı takdir edeceğim.

yesod 1.1.4.1 ile ghc 7.6.1 kullanıyorum.

Güncelleme:

Hammar önerisi aşağıdaki düzeltildi. Chat.hs'da iki değişiklik yaptım. rawJS için

  1. Ekleme ithalat beyanı:

    import Text.Julius (rawJS)

  2. Parça aşağı tüm Chat.hs içinde julius whamlet içinde # {} blokları örnekleri ve {# rawJS ...}

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

    bunların yerine

    yılında

cevap

12

Şu anda test etmek için Yesod'um yüklü değil, fakat this blog post'a göre 'u #{rawJS output}'a dönüştürmeniz ve böylece JavaScript tanımlayıcılarını enterpolasyon yaparken kullanmanız gerekir.

+0

Teşekkür ederim, @hammar. Tam olarak sorun buydu. Şimdi julius whamlet'in içindeki her # {} bloğu takip ettikten ve rawJS ile değiştirdikten sonra düzeltildi. – Sal

5

10, Text için ToJavascript örneklerini ve diğer bazı türleri kaldırılmıştır: Paketin önceki sürümlerinde, sadece şartlı engelli idi

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

ise:

#ifndef SAFER_INTERPOLATION 

Bunun kasıtlı olup olmadığını mı yoksa sadece unutulmuş bir gelişim değişikliği mi olduğunu bilmiyorum.

Örneği olduğu gibi kullanmak için, yesod'ü shakespeare-js < 1.1 karşı yeniden oluşturmanız gerekir. Bu, öncelikle bir çok paketin kaldırılması veya yeni bir sanal alanın kullanılması anlamına gelir (eğer cabal-dev veya başka bir sanal alan aracı kullanıyorsanız). shakespeare-js-1.1.0 içinde ToJavascript arasında

sadece örnekleri aeson paketinden RawJavascript (Builder etrafında newtype sargı) ve Value (JSON değerleri için bir tip).

Sadece bir RawJavascript değerini almak için bir RawJavascript . Data.Text.Lazy.Builder.fromText içinde

Text.Julius.toJavascript output 

içinde output sarın ve gerçek kod olsaydı o iş yapmak, ancak TH oluşturulan göre, senin TH düzeltmek gerekir başarabilecek çıktı ya da quasiquoter - ne yapmam gerektiğini biliyorum.

+0

Teşekkürler @ daniel-fischer. Gerçekten HamJ'in işaret ettiği gibi rawJS eksikti. – Sal

İlgili konular