我已经从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
答案 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
|]