2012-01-31 19 views
7

एक तरह से यह मेरे पिछले प्रश्न से पीछे एक कदम है, लेकिन ... क्या कोई मुझे याद दिला सकता है कि यह काम क्यों नहीं करता है?कंटेनर तत्व प्रकार

 
class Container c e where 
    empty :: c 
    insert :: e -> c -> c 

instance Container [x] x where 
    empty = [] 
    insert = (:) 

instance Container ByteString Word8 where 
    empty = BIN.empty 
    insert = BIN.cons 

instance Ord x => Container (Set x) x where 
    empty = SET.empty 
    insert = SET.insert 

स्पष्ट रूप से यदि यह इतना आसान था, तो कोई भी कार्यात्मक निर्भरताओं और न ही संबंधित प्रकारों का आविष्कार करने के लिए परेशान होता। तो उपरोक्त के साथ क्या समस्या है?

+0

इसका उपयोग करने का प्रयास करें। आपको जल्द ही अस्पष्ट अधिभार के बारे में शिकायतें मिलेंगी। – augustss

उत्तर

10

instance Container [Int] Int और instance Container [Int] Char जोड़ने से रोकने के लिए कुछ भी नहीं है, और जब आप empty :: [Int] के लिए पूछते हैं तो संकलक के पास यह जानने का कोई तरीका नहीं है कि यह किस उदाहरण से आना चाहिए।

"आह, लेकिन मेरे पास केवल instance Container [Int] Int है," आप कहते हैं। "और instance Container [Int] Char वैसे भी एक बग होगा।"

लेकिन संकलक यह नहीं जानता कि आप भविष्य में instance Container [Int] Char नहीं जोड़ेंगे, और यदि आप ऐसा करते हैं, तो इसके लिए आपके मौजूदा कोड को तोड़ने की अनुमति नहीं है।

तो हम संकलक कि

  • Container के पहले पैरामीटर विशिष्ट Container
  • का दूसरा पैरामीटर निर्धारित करता है बताने का कोई रास्ता जरूरत है अगर यह अलग-अलग विविधताएं है कि केवल दूसरे प्रकार में अलग देखता है, जो इंगित करता है एक बग

कार्यात्मक निर्भरता दर्ज करें।

+0

मुझे पता था कि मुझे कुछ स्पष्ट भूलना होगा ... – MathematicalOrchid

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