
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
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@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe