2015-04-17 3 views
0

Я принял участие в коде от http://www.yesodweb.com/book/persistent (раздел Synopsis) и пытаюсь загрузить его в ghci (v7.6.3, работающий на Ubuntu 14,04).Ошибка анализа Haskell при использовании DataBase.Persist (возможно, связанная с использованием квазициклов)

import   Database.Persist 
import   Database.Persist.Sqlite 
import   Database.Persist.TH 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] 
[persistLowerCase| 
Person 
    name String 
    age Int Maybe 
    deriving Show 
BlogPost 
    title String 
    authorId PersonId 
    deriving Show 
|] 

При загрузке этого в GHCI, я получаю следующее сообщение об ошибке:

Prelude> :load "/home/gautham/tmp/Test.hs" 
[1 of 1] Compiling Main    (/home/gautham/tmp/Test.hs, interpreted) 

/home/gautham/tmp/Test.hs:7:1: 
    parse error (possibly incorrect indentation or mismatched brackets) 
Failed, modules loaded: none. 
Prelude> 

который является строкой, начинающейся с 'Персоной'. Любая идея, что может быть причиной этого? Я просмотрел несколько примеров в Интернете и попробовал несколько вариантов отступов, но не смог их скомпилировать. Я предполагаю, что это связано с неправильным использованием квазициклов, но я не уверен, что?

Приветствия Gautham

ответ

2

Используете ли вы язык прагмами предложенные в учебнике, а? Другими словами, это ваш исходный файл начинается с

{-# LANGUAGE EmptyDataDecls    #-} 
{-# LANGUAGE FlexibleContexts   #-} 
{-# LANGUAGE GADTs      #-} 
{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE MultiParamTypeClasses  #-} 
{-# LANGUAGE OverloadedStrings   #-} 
{-# LANGUAGE QuasiQuotes    #-} 
{-# LANGUAGE TemplateHaskell   #-} 
{-# LANGUAGE TypeFamilies    #-} 

Все они могут быть не нужны, но вы можете выяснить, какие из них ненужной путем удаления одного в то время, пока вы не будете иметь минимальный набор, который все еще компилирует.

+0

Спасибо! Я видел другие образцы кода без этих прагм и предполагал, что они просто комментарии. Он еще не компилируется, но он перемещается вперед от ошибки синтаксического анализа. Я попытаюсь поэкспериментировать с выборочным включением их, как только я его скомпилирую. –

+0

@GauthamGanapathy Они используют тот же формат, что и комментарии, но они действительно являются специальными директивами, которые сообщают GHC о включении соответствующего расширения. Вам не нужно иметь их в исходном файле, но тогда вы должны сообщить GHC, какие расширения использовать с помощью флагов командной строки. – kqr

+1

Просто хотел заметить, что '{- # LANGUAGE QuasiQuotes # -}' был тем, что мне не хватало. – sbditto85

2

Вам необходимо включить много расширений языка:

{-# LANGUAGE GADTs      #-} 
{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE MultiParamTypeClasses  #-} 
{-# LANGUAGE QuasiQuotes    #-} 
{-# LANGUAGE TemplateHaskell   #-} 
{-# LANGUAGE TypeFamilies    #-} 

Кроме того, [persistLowerCase| ... |] должен либо начать на той же линии, как share или быть немного отступом, поскольку он является вторым параметром share. Таким образом, вы можете получить:

share [mkPersist sqlSettings, mkMigrate "migrateAll"] 
    [persistLowerCase| 
    Person 
     name String 
     age Int Maybe 
     deriving Show 
    BlogPost 
     title String 
     authorId PersonId 
     deriving Show 
    |] 
+0

Спасибо! Я попробую эти прагмы. Я попытался отделить раздел [persistLowerCase | ... |], но в то время он не работал, возможно, из пропавших прагм. –