I meant:

chara = Character 100 $ Armor 40 $ Gun 12 ()

2011/4/6 Yves Parès <limestrael@gmail.com>
Hello Café,

I'm trying to get some modular data types.
The idea that came to me is that I could stack them, for instance :

data Character a = Character { life :: Int,
                               charaInner :: a }

data Gun a = Gun { firepower :: Int,
                   gunInner :: a }

data Armor a = Armor { resistance :: Int,
                       armorInner :: a }

Then a character with a gun and an armor can be build this way:

chara = Character 100 $ Armor 40 $ Gun 12

The idea now is to be able to get some part of the character:

itsGun :: Character ?? -> Gun ??
itsGun = content

Then content would be a class method:

class Has b a where
    content :: a -> b

And it would be recursively defined so that:

instance (Has c b, Has b a) => Has c a where
    content = (content :: b -> c) . (content :: a -> b)

Then itsGun would be more like:

itsGun :: (Has Gun a) => a -> Gun ??
itsGun = content

But after some juggling with extensions (ScopedTypeVariables, UndecidableInstances, IncoherentInstances...) I can't get it working.

Has someone a simpler way to achieve modular types?