使用DataBase.Persist时Haskell解析错误(可能与准引号的使用有关)

时间:2015-04-17 13:19:32

标签: haskell persistent

我已经从http://www.yesodweb.com/book/persistent(概要部分)中获取了部分代码,并尝试将其加载到ghci(v7.6.3,在Ubuntu 14.04上运行)。

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>

这是以' Person'开头的行。知道可能导致这种情况的原因吗?我已经在网上查看了几个例子并尝试了几种缩进版本,但是还没有能够编译它。我认为它与错误使用准引号有关,但我不确定是什么?

干杯 Gautham

2 个答案:

答案 0 :(得分:2)

您是否正在使用教程中建议的语言编译指示?换句话说,您的源文件是否以

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

可能不需要所有这些,但是你可以通过一次删除一个来找出哪些是不需要的,直到你有一个仍然编译的最小集合。

答案 1 :(得分: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
    |]