2017-11-10 12 views
1

私はこのコードを持っているPersistentチュートリアル、従うことをしようとしている:Haskellのエラー参照コードがコードに含まれていませんか?

{-# 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に関連していると感じていますが、これを理解するには十分に分かりません。これをどのようにデバッグできますか?

+3

'TemplateHaskell'はコンパイル時にコードを生成します。そのコードはまだコンパイルする必要があります。ここで、Template Haskellは、コンパイルを有効にしたよりも多くの拡張を必要とするコードを生成しています。 – Alec

+0

おそらくこのチュートリアルでは、既にリストされている拡張機能にその拡張機能を追加するのを忘れていました。有効にするだけでOKです。 – chi

答えて

0

GHCから拡張機能を追加するように指示された場合、通常は拡張機能を追加することをおすすめします。

ここでは、[name|...|]という表記法は、他の言語のマクロと同様に、テンプレートHaskellを使用してコンパイル時にコードを生成する疑似引用用の表記法です。だからエラーはあなたのコードではなく、あなたのコードのコードで!

Template Haskellをデバッグするのが難しいというエラーです。そのため、コミュニティがかなり使い分けられています。

関連する問題