ошибка: ошибка синтаксического анализа при вводе ‘{’ с использованием простого кода yesod

Я построил базовый шаблон yesod следующим образом:

stack new kek yesod-simple
stack build 

это было нормально. После этого я попытался добавить обработчик, следуя этому руководству, часть echo:

  1. Я добавил /echo/#String EchoR GET в config/routes

  2. Я также добавил следующий обработчик в Home.hs

    getEchoR :: String -> Handler RepHtml    
    getEchoR theText = do    
        defaultLayout $ do    
                [whamlet|<h1>#{theText}|]
    

Когда я снова попробовал stack build, я получил следующую ошибку:

[8 of 9] Compiling Handler.Home     ( src/Handler/Home.hs, .stack-work/dist/x86_64-linux-nopie/Cabal-1.24.2.0/build/Handler/Home.o )

/home/kek/me/haskell/webservices/lol/src/Handler/Home.hs:72:23: error: parse error on input ‘{’

--  While building package lol-0.0.0 using:
      /home/kek/.stack/setup-exe-cache/x86_64-linux-nopie/Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2 --builddir=.stack-work/dist/x86_64-linux-nopie/Cabal-1.24.2.0 build lib:lol --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1

Я просто скопировал эту строку whamlet[...] из туториала, все остальное генерируется по шаблону yesod-simple, ничего не менял.

upd: мне удалось заставить его работать, изменив код обработчика на следующий:

getEchoR :: String -> Handler RepHtml
getEchoR theText = do
    defaultLayout $ do
        setTitle "My Awesome Site"
        $(widgetFile "echo")

И добавить пример файла echo.hamlet в /templates/

<!-- Static navbar -->
<nav .navbar.navbar-default.navbar-static-top>
    <div .container>
        <div .navbar-header>
            <button type="button" .navbar-toggle.collapsed data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>

        <div #navbar .collapse.navbar-collapse>
            <ul .nav.navbar-nav>

            <ul .nav.navbar-nav.navbar-right>


<!-- Page Contents -->

<div .container>


<!-- Footer -->
<footer .footer>
    <div .container>
        <p .text-muted>

Поэтому мой вопрос меняется на следующий: обязан ли я это делать в данном случае?


person Asalle    schedule 29.11.2017    source источник
comment
Можете ли вы поместить код в репозиторий github или что-то в этом роде? Хотя я предполагаю, что вам просто не хватает такой прагмы, как {-# LANGUAGE QuasiQuotes #-} (и, возможно, TemplateHaskell OverloadedStrings, TypeFamilies)   -  person unhammer    schedule 29.11.2017
comment
@unhammer спасибо, я добавил прагму квазицитирования, и она работает! Пожалуйста, добавьте ответ, чтобы я мог его принять.   -  person Asalle    schedule 29.11.2017


Ответы (1)


[whamlet|<h1>#{theText}|] – это квазицитата синтаксис; для этого необходимо включить расширение QuasiQuotes GHC.

Самый простой способ включить его — добавить прагму {-# LANGUAGE QuasiQuotes #-} в начало файла .hs (что включает его только для этого файла — вы также можете включить прагмы для всего проекта в файле Cabal).

person unhammer    schedule 29.11.2017