Есть ли ошибка в этом выражении квазикавычек?

Я пытаюсь скомпилировать пример кода из Network.JMacroRPC.Snap:

module Main where
import Network.JMacroRPC.Snap
import Snap.Http.Server
import Snap.Core
import Language.Javascript.JMacro
import Control.Concurrent
import Control.Monad.Trans
import Network.JMacroRPC.Base
import Text.XHtml hiding(dir)
import qualified Data.Text as T

jsScript f = script (primHtml f) ! [thetype "text/javascript"]
jsScript' = jsScript . show . renderJs

testPage = mkConversationPageNoCulling pageFun (newMVar (1::Int)) jRpcs
    where pageFun :: JStat ->  Snap ()
          pageFun js = writeText $ T.pack $ show $
                       (header << [script ! [src "https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"] << noHtml]) +++
                       jsScript' js +++
                       jsScript' ([jmacro|$(\
                                     {
                                           var b = $("<button>click me!</button>");
                                           $("body").append(b);
                                           b.click(\ {
                                               var c = getCounter();
                                               alert ("counter is: " + c);
                                           });
                                     });
                                  |]);
          jRpcs = [getCounterRPC]
          getCounterRPC =
              toJsonConvRPC "getCounter" $ \s -> (liftIO $ retRight =<< modifyMVar s (\i -> return (i+1,i)) :: Snap (Either String Int))

retRight :: a -> IO (Either String a)
retRight = return . Right

main = quickHttpServe =<< testPage

И я сталкиваюсь с ошибкой:

% cabal build                                                                                                                                                                                                                    
Building jmacro-snap-example-0.1.0.0...
Preprocessing executable 'jmacro-snap-example' for
jmacro-snap-example-0.1.0.0...
[1 of 1] Compiling Main             ( Main.hs, dist/build/jmacro-snap-example/jmacro-snap-example-tmp/Main.o )

Main.hs:22:38: parse error on input `{'

Таким образом, похоже, что у ghc возникла проблема с выражением квазикавычек jmacro. Я не уверен, связано ли это с ошибкой в ​​​​коде или я делаю что-то неправильно при его компиляции.

Я использую ghc 7.6.3 и cabal 1.20.0.1 с этим файлом cabal:

name:                jmacro-snap-example
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10

executable jmacro-snap-example
  main-is:             Main.hs
  other-extensions:    TemplateHaskell
  build-depends:       base >=4.6 && <4.7, jmacro-rpc-snap >=0.3 && <0.4, snap-server >=0.9 && <0.10, snap-core >=0.9 && <0.10, jmacro >=0.6 && <0.7, mtl >=2.1 && <2.2, jmacro-rpc >=0.3 && <0.4, xhtml >=3000.2 && <3000.3, text >=0.11 && <0.12
  default-language:    Haskell2010

person rampion    schedule 06.07.2014    source источник
comment
Я получаю ту же ошибку с ghc-7.8.2   -  person rampion    schedule 07.07.2014
comment
Вам нужно включить QuasiQuotes отдельно от TemplateHaskell.   -  person Ørjan Johansen    schedule 07.07.2014
comment
Похоже на комментарий это дает пример, включающий директиву QuasiQuotes, должно быть, был скрыт на пути к взлому.   -  person rampion    schedule 07.07.2014


Ответы (1)


Выяснил это, прочитав Quasiquotation примерно тогда, когда Орьян Йохансен указал мне на это - мне нужно было поставить {-# LANGUAGE QuasiQuotes #-} вверху примера код.

Теперь он компилируется и в основном работает (сервер не выдает заголовок Content-Type при ответе со страницей, из-за чего в моем браузере он выглядит шатко), но в остальном успех.

person rampion    schedule 07.07.2014