{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
data Circle
= Circle
Int deriving Show data Square
= Square
Int deriving Show
class Drawable a where
instance Drawable Circle where
draw
(Circle x
) = print $ ("I'm circle " ++ show x
)
instance Drawable Square where
draw
(Square x
) = print $ ("I'm square " ++ show x
)
data Proxy = forall a. Drawable a => Proxy a
instance Drawable Proxy where
draw (Proxy a) = draw a
instance Drawable [Proxy] where
main = do
draw [Proxy $ Circle 42, Proxy $ Square 100500]
ey0jIExBTkdVQUdFIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24gIy19CnstIyBMQU5HVUFHRSBGbGV4aWJsZUluc3RhbmNlcyAjLX0KCmRhdGEgQ2lyY2xlID0gQ2lyY2xlIEludCBkZXJpdmluZyBTaG93CmRhdGEgU3F1YXJlID0gU3F1YXJlIEludCBkZXJpdmluZyBTaG93CgpjbGFzcyBEcmF3YWJsZSBhIHdoZXJlCiAgZHJhdyA6OiBhIC0+IElPICgpCgppbnN0YW5jZSBEcmF3YWJsZSBDaXJjbGUgd2hlcmUKICBkcmF3IChDaXJjbGUgeCkgPSBwcmludCAkICgiSSdtIGNpcmNsZSAiICsrIHNob3cgeCkKCmluc3RhbmNlIERyYXdhYmxlIFNxdWFyZSB3aGVyZQogIGRyYXcgKFNxdWFyZSB4KSA9IHByaW50ICQgKCJJJ20gc3F1YXJlICIgKysgc2hvdyB4KQoKZGF0YSBQcm94eSA9IGZvcmFsbCBhLiBEcmF3YWJsZSBhID0+IFByb3h5IGEKaW5zdGFuY2UgRHJhd2FibGUgUHJveHkgd2hlcmUKICBkcmF3IChQcm94eSBhKSA9IGRyYXcgYQoKaW5zdGFuY2UgRHJhd2FibGUgW1Byb3h5XSB3aGVyZQogIGRyYXcgPSBtYXBNXyBkcmF3CgptYWluID0gZG8KICBkcmF3IFtQcm94eSAkIENpcmNsZSA0MiwgUHJveHkgJCBTcXVhcmUgMTAwNTAwXQo=