Hi everyone,

I believe I have come to the conclusion that what I would like to do is impossible, but I would like to have that confirmed. I would basically like to be able to have a heterogeneous list without boxing everything in a data type. Below is the sample code, with the code I would like to use commented out. I'm I missing something, or does Haskell simply not support what I am trying for?

{-# LANGUAGE ExistentialQuantification #-}

data Foo = Foo String
class IFoo a where
    toFoo :: a -> Foo
instance IFoo Foo where
    toFoo = id

data A = A String
instance IFoo A where
    toFoo (A a) = Foo a

data B = B Int
instance IFoo B where
    toFoo (B b) = Foo $ show b

data FooBox = forall t. IFoo t => FooBox t
instance IFoo FooBox where
    toFoo (FooBox f) = toFoo f

myPrint :: IFoo t => [(String, t)] -> IO ()
myPrint = mapM_ myPrint'

myPrint' :: IFoo t => (String, t) -> IO ()
myPrint' (key, value) =
    let (Foo foo) = toFoo value
     in putStrLn $ key ++ ": " ++ foo

{- What I'd like to do:
main = myPrint
    [ ("one", Foo "1")
    , ("two", A "2")
    ]
-}

main = myPrint
    [ ("one", FooBox $ Foo "1")
    , ("two", FooBox $ A "2")
    ]

----

Thanks