[Haskell-beginners] Existential data types

Michael Snoyman michael at snoyman.com
Mon Dec 15 12:49:38 EST 2008


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20081215/05e6c5ee/attachment.htm


More information about the Beginners mailing list