我正在尝试按照Persistent教程进行操作,该教程包含以下代码:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Database.Persist
import Database.Persist.TH
import Database.Persist.Sqlite
import Control.Monad.IO.Class (liftIO)
mkPersist sqlSettings [persistLowerCase|
Person
name String
age Int
deriving Show
|]
但是当我尝试运行它时,我得到了:
src/model.hs:31:1: error:
• Illegal instance declaration for ‘ToBackendKey SqlBackend Post’
(Only one type can be given in an instance head.
Use MultiParamTypeClasses if you want to allow more, or zero.)
• In the instance declaration for ‘ToBackendKey SqlBackend Post’
那些声明(ToBackendKey
等)不在我的代码中,而不在第31行。发生了什么?我有一种感觉它与TemplateHaskell有关,但我对它的了解并不充分。我该怎么调试呢?
答案 0 :(得分:0)
当GHC要求您添加扩展程序时,通常最好这样做。
这里的诀窍是[name|...|]
符号用于准引用,它使用Template Haskell在编译时生成代码,就像其他语言中的宏一样。所以错误不在你的代码中,而是在代码的代码中!
这样的错误使得模板Haskell难以调试,这就是为什么社区在使用上存在相当分歧的原因。