J'ai un schéma qui dispose de 6 types différents d'entités, mais elles ont toutes beaucoup de choses en commun. J'ai pensé que je pourrais probablement abstraite beaucoup de points communs au niveau du type, mais j'ai frappé un problème avec HaskellDB et de la superposition des instances. Voici le code que j'ai commencé avec, qui fonctionne très bien:
import Database.HaskellDB
import Database.HaskellDB.DBLayout
data Revision a = Revision deriving Eq
data Book = Book
instance FieldTag (Revision a) where
fieldName _ = "rev_id"
revIdField :: Attr (Revision Book) (Revision Book)
revIdField = mkAttr undefined
branch :: Table (RecCons (Revision Book) (Expr (Revision Book)) RecNil)
branch = baseTable "branch" $ hdbMakeEntry undefined
bookRevision :: Table (RecCons (Revision Book) (Expr (Revision Book)) RecNil)
bookRevision = baseTable "book_revision" $ hdbMakeEntry undefined
masterHead :: Query (Rel (RecCons (Revision Book) (Expr (Revision Book)) RecNil))
masterHead = do
revisions <- table bookRevision
branches <- table branch
restrict $ revisions ! revIdField .==. branches ! revIdField
return revisions
Cela fonctionne bien, mais branch
est trop spécifique. Ce que je veux exprimer est la suivante:
branch :: Table (RecCons (Revision entity) (Expr (Revision entity)) RecNil)
branch = baseTable "branch" $ hdbMakeEntry undefined
Cependant, avec ce changement, j'obtiens l'erreur suivante:
Overlapping instances for HasField
(Revision Book)
(RecCons (Revision entity0) (Expr (Revision entity0)) RecNil)
arising from a use of `!'
Matching instances:
instance [overlap ok] HasField f r => HasField f (RecCons g a r)
-- Defined in Database.HaskellDB.HDBRec
instance [overlap ok] HasField f (RecCons f a r)
-- Defined in Database.HaskellDB.HDBRec
(The choice depends on the instantiation of `entity0'
To pick the first instance above, use -XIncoherentInstances
when compiling the other instance declarations)
In the second argument of `(.==.)', namely `branches ! revIdField'
In the second argument of `($)', namely
`revisions ! revIdField .==. branches ! revIdField'
In a stmt of a 'do' expression:
restrict $ revisions ! revIdField .==. branches ! revIdField
J'ai essayé de jeter aveuglément -XOverlappingInstances
et -XIncoherentInstances
à ce, mais ça n'aide pas (et j'aimerais vraiment comprendre pourquoi le remplacement d'un type de béton avec une variable de type causes de ce si problématique).
Une aide et des conseils seront très appréciés!