2010-07-25 25 views
7

मेरे आवेदन में मुझे एक मनमानी डेटाटाइप युक्त वेक्टर को क्रमबद्ध करने की आवश्यकता है, इस मामले में डबल्स की एक सूची है। वेक्टर को क्रमबद्ध करने के लिए मैं डेटा आयात कर रहा हूं। वेक्टर। बाइनरी।Data.Vector.Binary बाइनरी ओवरलैप करता है [ए] उदाहरण

Overlapping instances for Binary [Double] 
    arising from a use of `decode' at Statistics.hs:57:33-42 
Matching instances: 
    instance (Data.Vector.Generic.Base.Vector v a, Binary a) => 
      Binary (v a) 
    -- Defined in Data.Vector.Binary 
    instance (Binary a) => Binary [a] -- Defined in Data.Binary 

सूची वेक्टर का एक उदाहरण है:

जब GHCi में मॉड्यूल निम्न त्रुटि पैदा होती है लोड हो रहा है? मैंने प्रलेखन को देखा लेकिन ऐसा उदाहरण नहीं मिला।

इस संरचना को क्रमबद्ध करने में सक्षम होने के लिए मैं क्या कर सकता हूं?

संपादित करें:

मैं निम्नलिखित पैकेज संस्करणों का उपयोग कर रहा हूँ:

  • वेक्टर-0.6.0.2
  • वेक्टर बाइनरी-उदाहरणों-0.1.2
  • बाइनरी-0.5.0.2

यहां एक स्निपेट भी है जो इस बार शो की सूची के साथ इस मुद्दे को दिखाता है:

import Data.Binary 
import Data.Vector.Binary 
import qualified Data.ByteString.Lazy as L 

main = L.writeFile "/tmp/aaa" $ encode "hello" 
+1

क्या आप कृपया बाइनरी और वेक्टर के कौन से संस्करण पोस्ट कर रहे हैं, पोस्ट कर सकते हैं? –

+0

मैं मानता हूं कि जीएचसीआई मानते हैं कि सूचियां वैक्टर हैं। मैंने वेक्टर-बाइनरी-इंस्टेंस के लिए स्रोत कोड को देखा है और इसे नहीं मिला है। –

+1

यह स्पष्ट नहीं है। एडवर्ड Kmett इस मुद्दे को बहुत पहले नहीं बताया http://stackoverflow.com/questions/3213490/how-do-i-write-if-typeclass-a-then-a-is-also-an-instance-of-b -by-this-definiti –

उत्तर

7

ठीक है, मुझे लगता है कि मुझे यहां समस्या दिखाई देती है। वेक्टर-बाइनरी-इंस्टेंस पैकेज परिभाषित करता है:

instance (Data.Vector.Generic.Base.Vector v a, Binary a) => Binary (v a) 

जो बहुत खराब है। इस परिभाषा का अर्थ है "किसी भी प्रकार के लिए 'v', यह एक वैध बाइनरी उदाहरण है"। इसका मतलब है कि यह उदाहरण किसी भी प्रकार के लिए उपलब्ध है जो v a से मेल खाता है। इसमें सभी सूचियों, सभी मकानों और सभी मोनैड शामिल हैं (लेकिन इस तक सीमित नहीं है)।

Prelude Data.Binary Data.Vector.Binary Data.ByteString.Lazy> :t getChar 
getChar :: IO Char 
Prelude Data.Binary Data.Vector.Binary Data.ByteString.Lazy> encode getChar 
<interactive>:1:0: 
    No instance for (Data.Vector.Generic.Base.Vector IO Char) 
     arising from a use of `encode' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for 
     (Data.Vector.Generic.Base.Vector IO Char) 
    In the expression: encode getChar 
    In the definition of `it': it = encode getChar 

यहाँ दुभाषिया getChar :: IO Char के लिए इस उदाहरण का उपयोग करने के, जो स्पष्ट रूप से गलत है प्रयास कर रहा है: एक प्रदर्शन के रूप में, GHCi निम्नलिखित रिपोर्ट।

संक्षिप्त उत्तर: अब के लिए वेक्टर-बाइनरी-इंस्टेंस का उपयोग न करें। यह उदाहरण टूटा हुआ है, और यह बताया गया है कि हास्केल कोड के माध्यम से उदाहरण कैसे फैलते हैं इससे समस्याएं पैदा हो जाएंगी। जब तक यह तय नहीं हो जाता है, आपको वैक्टरों के लिए अपने द्विआधारी उदाहरण लिखना चाहिए। आप एक monomorphic वेक्टर प्रकार

instance (Binary a) => Binary (Vector a) where 

मेरा मानना ​​है कि यह किसी भी वेक्टर जो Data.Vector.Generic.Vector का एक उदाहरण है के साथ काम करेंगे करने के लिए वेक्टर बाइनरी-उदाहरणों से कोड कॉपी करके उसे प्रतिबंधित करने के लिए सक्षम होना चाहिए।

आप इसके बारे में वेक्टर-बाइनरी-इंस्टेंस रखरखाव से संपर्क भी कर सकते हैं।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद, एडवर्ड Kmett के उत्तर के लिंक को यह समझने में मदद मिली कि ऐसा क्यों होता है। उन्हें उद्धृत करते हुए: 'कई तरीकों से,' उदाहरण 'और' वर्ग 'परिभाषाओं के लिए वाक्यविन्यास पीछे की तरफ है।'मैं आपके सुझावों का पालन करूंगा, जिसके लिए मैं आभारी हूं। – uu1101

+0

आपका स्वागत है; मुझे खुशी है कि यह सहायक था। –

+0

पैकेज अद्यतन किया गया है। मैं बस बॉक्सिंग और अनबॉक्स किए गए वेक्टर मामलों को अलग-अलग बताता हूं (ध्यान दें कि आप केवल 'वेक्टर ए' का उपयोग नहीं कर सकते हैं, क्योंकि यह केवल बॉक्स वाले हैं)। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^