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

Haskell parse error when using DataBase.Persist (possibly related to use of quasi quotes)

我已经从 http://www.yesodweb.com/book/persistent(概要部分)中提取了部分代码,并试图将其加载到 ghci(v7.6.3,运行 on 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'开头的行。知道是什么原因造成的吗?我查看了网络上的几个示例并尝试了几种缩进变体,但无法编译。我认为这与错误使用准引号有关,但我不确定是什么?

干杯 高瑟姆

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

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

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

您需要启用很多语言扩展:

{-# 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
    |]