मेरे पास एक स्कीमा है जिसमें 6 विभिन्न प्रकार की इकाइयां हैं, लेकिन उनमें से सभी में बहुत सी चीजें आम हैं। मैंने सोचा कि मैं शायद इस स्तर पर इस सामान्यता को बहुत कम कर सकता हूं, लेकिन मैंने हास्केल डीबी और अतिव्यापी उदाहरणों के साथ एक समस्या को मारा है। यहाँ कोड मैं के साथ शुरू किया है, जो ठीक काम करता है:मैं पॉलिमॉर्फिक फ़ील्ड के साथ हास्केलडीबी का उपयोग कैसे कर सकता हूं? (ओवरलैपिंग उदाहरणों में समस्याएं)
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
यह ठीक काम करता है, लेकिन branch
भी विशिष्ट है।
branch :: Table (RecCons (Revision entity) (Expr (Revision entity)) RecNil)
branch = baseTable "branch" $ hdbMakeEntry undefined
हालांकि, इस परिवर्तन के साथ, मैं निम्नलिखित त्रुटि मिलती है:: क्या मैं वास्तव में व्यक्त करना चाहता हूँ निम्नलिखित है
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
मैं आँख बंद करके -XOverlappingInstances
और -XIncoherentInstances
इस पर फेंक की कोशिश की है, लेकिन वह मदद नहीं करता है (और मैं वास्तव में समझना चाहता हूं कि एक प्रकार के चर के साथ एक ठोस प्रकार को बदलने का कारण यह इतना समस्याग्रस्त हो जाता है)।
कोई भी मदद और सलाह की सराहना की जाएगी!
उपयोगकर्ता मार्गदर्शिका के अनुसार http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#undecidable-instances IncoherentInstances को डेटाबेस में जोड़ा जाना होगा। HaskellDB। एचडीबीआरईसी प्रभावी होने के लिए। –
विशेष रूप से: इच्छा ओवरलैप हो या बेतुका उदाहरण घोषणा ही है, उपस्थिति से या अन्यथा -XOverlappingInstances और -XIncoherentInstances झंडे जब कि मॉड्यूल परिभाषित किया जा रहा है नियंत्रित की संपत्ति है। –