Haskell 异质映射

Haskell 异质映射,haskell,polymorphism,existential-type,higher-rank-types,Haskell,Polymorphism,Existential Type,Higher Rank Types,我需要一个可以包含任意值的映射,只要它们的类型是相同的typeclass。我的第一个天真方法是这样的: 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

我需要一个可以包含任意值的映射,只要它们的类型是相同的typeclass。我的第一个天真方法是这样的:

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" }
我原以为我需要特殊的异构集合,但奇怪的是,我在谷歌上找不到任何东西,除了,但这个库似乎有点邋遢和陈旧。
正确执行此操作的方法是什么(希望没有其他库,仅使用GHC扩展)?

尝试使用适当的存在类型

{-# LANGUAGE ExistentialQuantification #-}

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

type HMap = Map Int Elem

非常感谢你!真遗憾,我自己没有。我想我必须比现在睡得更多)