Tôi có một lược đồ có 6 loại thực thể khác nhau, nhưng tất cả chúng đều có nhiều điểm chung. Tôi nghĩ rằng tôi có thể có thể trừu tượng rất nhiều tính phổ biến này ra ở cấp độ loại, nhưng tôi đã nhấn một vấn đề với HaskellDB và các trường hợp trùng lặp. Đây là mã tôi đã bắt đầu, hoạt động tốt:Làm cách nào để sử dụng HaskellDB với các trường đa hình? (Các vấn đề với các trường hợp trùng lặp)
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
Điều này làm việc tốt, nhưng branch
quá cụ thể. Những gì tôi thực sự muốn thể hiện như sau:
branch :: Table (RecCons (Revision entity) (Expr (Revision entity)) RecNil)
branch = baseTable "branch" $ hdbMakeEntry undefined
Tuy nhiên, với sự thay đổi này, tôi nhận được lỗi sau:
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
tôi đã cố gắng một cách mù quáng ném -XOverlappingInstances
và -XIncoherentInstances
lúc này, nhưng điều đó không giúp đỡ (và tôi muốn thực sự hiểu tại sao thay thế một loại bê tông với một biến kiểu gây ra vấn đề này).
Bất kỳ trợ giúp và lời khuyên nào sẽ được đánh giá cao!
Theo hướng dẫn sử dụng http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#undecidable-instances IncoherentInstances cần phải được thêm vào Database.HaskellDB. HDBRec có hiệu lực. –
Cụ thể: Sự sẵn sàng để được chồng chéo hoặc không mạch lạc là một thuộc tính của bản thân khai báo cá thể, được kiểm soát bởi sự hiện diện hoặc các cờ -XOverlappingInstances và -XIncoherentInstances khi mô-đun đó đang được xác định. –