Haskell错误引用代码中没有的代码?

时间:2017-11-10 16:24:48

标签: haskell

我正在尝试按照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有关,但我对它的了解并不充分。我该怎么调试呢?

1 个答案:

答案 0 :(得分:0)

当GHC要求您添加扩展程序时,通常最好这样做。

这里的诀窍是[name|...|]符号用于准引用,它使用Template Haskell在编译时生成代码,就像其他语言中的宏一样。所以错误不在你的代码中,而是在代码的代码中!

这样的错误使得模板Haskell难以调试,这就是为什么社区在使用上存在相当分歧的原因。