[Haskell-cafe] how would this be done? type classes? existential
fis at wiwi.hu-berlin.de
Thu Mar 16 06:57:54 EST 2006
this is one of those situations that always make scheme and perl
hackers laugh at me: i have written a piece of code that is
intuitively clear, and now i am trying to turn it into something that
compiles. and here it goes.
i have a type class that looks something like this:
class Resource a where
resourceName :: a -> String
resourceAdvance :: a -> a
resourceStarved :: a -> Bool
resourceSpend :: a -> Int -> a
resourceEarn :: a -> Int -> a
resource types are rice, crude oil, pizza, software code, and so on.
they all have a different internal structure and the same abstract
interface, that's why i have defined this type class.
now i want to create a list of a type similar to
[r1, r2, r3] :: (Resource a) => [a]
but with r1 being pizza, r2 being crude oil, and so on. my first idea
data Rs = forall a . (Resource a) => Rs a
unRs (Rs a) = a
rsName :: Rs -> String
rsName = resourceName . unRs
and then export Rs as an abstract data type. this would allow for
lists of type [Rs], which is exactly what i want.
but what is the type of unRs? or better: can i make it type at all?
and isn't this solution a little redundant and verbose? should i do
it like in the example for existentially quantified types in the ghc
but wouldnt't the code become really messy? or should i do the type
class and instances, and then do Rs the existentially quantified way,
with all class methods arguments to the Rs constructor? or is there a
completely different way to do this (besides using scheme or perl :-)?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org//pipermail/haskell-cafe/attachments/20060316/75d26d6c/attachment.bin
More information about the Haskell-Cafe