2012-11-30 6 views
9

Sto provando Yesod esempi di libri documentati sulla pagina web Yesod. Uno degli esempi è per Chat application embedded in Wiki. Quando provo in ghci (caricamento Chat modulo dal Wiki.hs che contiene Wiki codice di esempio), ottengo l'errore sotto per Chat.hs:Errore di compilazione durante il tentativo di alcuni esempi 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) [])), 
     ....]' 

Io non sono molto familiare con le librerie Yesod ancora. Quindi, sono perplesso dall'errore di cui sopra - Ho visto questo errore anche in altri esempi Yesod dove viene chiamata la funzione toWidget. Quindi, sembra essere correlato alla funzione toWidget. Apprezzerò l'aiuto nel correggere l'errore di cui sopra.

Sto usando ghc 7.6.1 con yesod 1.1.4.1.

Aggiornamento:

fisso seguendo il suggerimento di Hammar. Ho apportato due modifiche in Chat.hs.

  1. Add dichiarazione di importazione per rawJS:

    import Text.Julius (rawJS)

  2. rintracciare tutte le istanze di # {} blocchi all'interno julius whamlet in Chat.hs, e sostituirli con {# rawJS ...}

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

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

risposta

12

Non ho installato Yesod per testarlo al momento, ma in base allo this blog post dovresti solo cambiare a #{rawJS output} e così via quando interpoliamo identificativi JavaScript.

+0

grazie, @hammar. Questo era esattamente il problema. Risolto adesso dopo aver rintracciato ogni blocco # {} all'interno di julius whamlet e sostituito con rawJS. – Sal

5

In shakespeare-js-1.1.0, le ToJavascript istanze per Text e alcuni altri tipi sono stati rimossi:

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

mentre nelle precedenti versioni del pacchetto, erano solo condizionatamente disabilitato:

#ifndef SAFER_INTERPOLATION 

Non so se sia intenzionale e sia destinato a rimanere tale, o solo un cambiamento di sviluppo dimenticato.

Per utilizzare l'esempio così com'è, è necessario ricostruire yesod con shakespeare-js < 1.1. Ciò significherebbe prima disinstallare molti pacchetti o una nuova sandbox (se usi cabal-dev o qualche altro strumento sandboxing).

Gli unici casi di ToJavascript in shakespeare-js-1.1.0 sono RawJavascript (a newtype involucro intorno Builder) e Value (un tipo per valori JSON) dal pacchetto aeson.

Si potrebbe semplicemente avvolgere output in

Text.Julius.toJavascript output 

in un RawJavascript . Data.Text.Lazy.Builder.fromText per ottenere un valore RawJavascript e farlo funzionare se fosse il codice vero e proprio, ma dal momento che è TH-generated, avresti bisogno di fissare il TH uscita o quasiquoter - nessuno dei quali so come fare.

+0

Grazie @ daniel-fischer. In effetti, RawJS mancava come ha sottolineato Hammar. – Sal