Гетерогенная карта

Мне нужна карта, которая может содержать произвольные значения, если их типы относятся к одному классу типов. Мой первый наивный подход был примерно таким:

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)?

8
задан Don Stewart 24 May 2012 в 15:30
поделиться