2012-05-24 19 views
7

Türleri aynı kategoride olduğu sürece rasgele değerler içerebilen bir haritaya ihtiyacım var. Benim ilk naif yaklaşım böyle bir şeydi:Heterojen harita

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

ama işe görünmüyor: Aşağıdaki kod, bir derleme hatası verir:

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" } 

Ben özel heterojen koleksiyon gerektiğini düşündü, ama garip Google'da this hariç hiçbir şey bulamadım, ancak bu kitaplık çok kirli ve eski görünüyor. Bunu doğru şekilde yapmanın yolu nedir (umarız diğer kütüphaneler olmadan, sadece GHC uzantılarını kullanarak)?

cevap

9

Uygun bir varoluşsal tür kullanmayı deneyin.

{-# LANGUAGE ExistentialQuantification #-} 

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

type HMap = Map Int Elem 
+0

Çok teşekkür ederim! Kendime sahip olmadığım bir utanç. Sanırım benden daha fazla uyumaya ihtiyacım var. –