[Haskell-cafe] Stacking data types
Yves Parès
limestrael at gmail.com
Wed Apr 6 20:57:51 CEST 2011
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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110406/e91f8fc9/attachment.htm>
More information about the Haskell-Cafe
mailing list