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を除いてGoogleで何も見つけられませんでしたが、このライブラリは厄介で古いものです。 これを正しく実行する方法は何ですか(うまくいけば、GHC拡張機能のみを使用して他のライブラリを使用しないでください)?

答えて

9

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

{-# LANGUAGE ExistentialQuantification #-} 

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

type HMap = Map Int Elem 
+0

ありがとうございました!私が自分で持っていないのは残念です。私は今よりももっと寝なければならないと思う) –