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