Ho bisogno di una mappa che possa contenere valori arbitrari purché i loro tipi siano dello stesso tipo. Il mio primo approccio ingenuo è stato qualcosa di simile:Mappa eterogenea
type HMap = forall a . MyClass a => M.Map Int a
ma non sembra funzionare: il codice seguente dà un errore di compilazione:
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" }
ho pensato che ho bisogno di raccolta eterogenea di speciale, ma stranamente Non ho trovato nulla in Google tranne this, ma questa libreria sembra un po 'trasandata e vecchia. Qual è il modo di farlo correttamente (si spera senza altre librerie, usando solo le estensioni GHC)?
Grazie mille! È un peccato che non ce l'abbia nemmeno io. Credo di dover dormire più di quanto non faccia ora) –