[Haskell-cafe] Lists of Existential DT

Ryan Ingram ryani.spam at gmail.com
Sun Feb 28 14:07:32 EST 2010


drawMany is just sequence dressed up a bit:

I assume you have this class:

class Drawable a where
    draw :: Drawable a => a -> Window -> IO ()

So, the key is to remember that functions and IO actions are first-class values!

data Box = ...
instance Drawable Box where ...
box :: Box
box = ...

data Circle = ...
instance Drawable Circle where ...
circle :: Circle
circle = ...

instance Drawable String where ...

with :: b -> [b -> a] -> [a]
with w = map ($ w)

manyWith :: Monad m => w -> [w -> m a] -> m ()
manyWith w = sequence . with w

sample :: Window -> IO ()
sample w =
    manyWith w $ [draw box, draw circle, draw "hello"]


On Sun, Feb 28, 2010 at 6:31 AM, Yves Parès <limestrael at gmail.com> wrote:
>
> Hello!
>
> I have a class Drawable, and some datatypes which are instances of it, and I
> would like to be able to draw them all at once!
> drawMany window [image, text, otherImage]
>
> I think the type of the function drawMany would be:
> drawMany :: Window -> [forall a. (Drawable a) => a] -> IO ()
>
> However it doesn't work.
> I know one solution is to make a new datatype (e.g. DrawableObj) which will
> be:
> data DrawableObj = forall a (Drawable a) =>
>                              DrawableObj a
>
> And then declare drawMany as:
> drawMany :: Window -> [DrawableObj] -> IO ()
>
> But to use it I have to wrap up myself every drawable in a DrawableObj:
> drawMany window [DrawableObj image, DrawableObj text, DrawableObj
> otherImage]
>
> Is there another more suitable way to handle a list of drawables?
>
> -----
> Yves Parès
>
> Live long and prosper
> --
> View this message in context: http://old.nabble.com/Lists-of-Existential-DT-tp27735354p27735354.html
> Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>


More information about the Haskell-Cafe mailing list