9

型が同じ型クラスである限り、任意の値を含むことができるマップが必要です。私の最初の素朴なアプローチは次のようなものでした:

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

特別な異種コレクションが必要だと思ったのですが、不思議なことにこれ以外はGoogleで見つけられませんでしたが、このライブラリはちょっとだらしなく古いようです。これを正しく行う方法は何ですか?

4

1 に答える 1

10

適切な存在タイプを使用してみてください。

{-# LANGUAGE ExistentialQuantification #-}

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

type HMap = Map Int Elem
于 2012-05-24T15:30:38.190 に答える