2012-05-24 49 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

非常感謝您!這是我自己沒有得到的恥辱。我想我現在必須睡得比現在更多) –