2012-05-24 24 views
7

मुझे एक मानचित्र की आवश्यकता है जिसमें मनमाने ढंग से मूल्य हो सकते हैं जब तक कि उनके प्रकार एक ही टाइपक्लास के हों। मेरी पहली अनुभवहीन दृष्टिकोण कुछ इस तरह था:विषम मानचित्र

type HMap = forall a . MyClass a => M.Map Int a 

लेकिन यह काम करने के लिए प्रतीत नहीं होता: निम्नलिखित कोड एक संकलन त्रुटि देता है:

testFunction :: (forall a . MyClass a => M.Map Int a) -> Int -> IO() 
testFunction m i = do 
    case M.lookup i m of 
     Nothing -> return() 
     Just v -> someActionFromMyClass v >> putStrLn "OK" 


Ambiguous type variable `a0' in the constraint: 
    (MyClass a0) arising from a use of `m' 
Probable fix: add a type signature that fixes these type variable(s) 
In the second argument of `M.lookup', namely `m' 
In the expression: (M.lookup i m) 
In a stmt of a 'do' block: 
    case (M.lookup i m) of { 
    Nothing -> return() 
    Just v -> someActionFromMyClass v >> putStrLn "OK" } 

मैंने सोचा था कि मैं जरूरत है विशेष विषम संग्रह है, लेकिन अजीब मैं this छोड़कर गूगल में कुछ भी नहीं मिला है, लेकिन इस पुस्तकालय तरह का मैला-कुचैला और पुराने लगता है। इस सही ढंग से करने का तरीका (उम्मीद के बिना अन्य पुस्तकालयों, केवल GHC एक्सटेंशन का उपयोग कर) क्या है?

उत्तर

9

एक उचित अस्तित्व प्रकार का उपयोग करें।

{-# LANGUAGE ExistentialQuantification #-} 

data Elem = forall e. C e => Elem e 

type HMap = Map Int Elem 
+0

आपको बहुत बहुत धन्यवाद! यह शर्म की बात है मैं इसे अपने आप नहीं मिला है है। मुझे लगता है मैं और अधिक सोने के लिए है लगता है की तुलना में मैं अब क्या) –

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