
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?