2016-03-06 3 views
4

Я использовал QuasiQuotations в Yesod, и все сработало нормально. НО мой файл стал очень большим и не приятно смотреть. Кроме того, мой TextEditor не выделяет этот синтаксис правильно. Вот почему разделены мои файлы следующим образом:Как импортировать Шекспировские шаблоны в Йесод?

getHomeR :: Handler Html 
getHomeR = do 
    webSockets chatApp 
    defaultLayout $ do 
     $(luciusFile "templates/chat.lucius") 
     $(juliusFile "templates/chat.julius") 
     $(hamletFile "templates/chat.hamlet") 

Если это не так, сообщите об этом. Выполнение runghc myFile.hs бросает много ошибок, как это:

chat_new.hs:115:9: 
    Couldn't match expected type ‘t0 -> Css’ 
       with actual type ‘WidgetT App IO a0’ 
    The lambda expression ‘\ _render_ajFK 
          -> (shakespeare-2.0.7:Text.Css.CssNoWhitespace . (foldr ($) ...)) 
            ...’ 
    has one argument, 
    but its type ‘WidgetT App IO a0’ has none 
    In a stmt of a 'do' block: 
     \ _render_ajFK 
     ... 

И это.

chat_new.hs:116:9: 
    Couldn't match type ‘(url0 -> [(Text, Text)] -> Text) 
         -> Javascript’ 
        with ‘WidgetT App IO a1’ 
    Expected type: WidgetT App IO a1 
     Actual type: JavascriptUrl url0 
    Probable cause: ‘asJavascriptUrl’ is applied to too few arguments 
    ... 

А также один для HTML (Гамлета).

Таким образом, по одному на каждый шаблон.

+0

Попробуйте выполнить компиляцию или интерпретацию с помощью флага '-ddump-splices' - он напечатает код, сгенерированный TH (кажется, что ошибки находятся в сгенерированном коде). Потенциально 'do' нарушает его? Попробуйте без него. – user2407038

+1

Ваш код выглядит нормально. Попробуйте использовать '$ (widgetFile« chat »)' вместо трех отдельных вызовов. – arrowd

+0

@arrowd Я попытался сделать это сначала. Это дает ошибку «не в объеме:». Нужно ли мне импортировать виджет-файл? И где именно я должен это назвать? – Spacemoose

ответ

2

Кажется, что hamletFile и другие рассматривают шаблоны как автономные, в то время как ваши ссылаются на что-то друг от друга. Вы можете играть с порядком *File вызовов, или использовать widgetFile*Yesod.Default.Util из модуля:

$(widgetFileNoReload def "chat") 

Reload вариант полезен для развития - это сделало бы yesod devel следить за изменениями файлов и загрузить их.

Смежные вопросы