[Haskell-beginners] Data Class problem
Michael Bradley
michael.bradley at hotmail.co.uk
Fri Aug 20 04:58:07 EDT 2010
Hello all!
I have been experimenting with data and class declarations and came across a problem. I have been trying to do this:
Code:
data Fire = Burn | Ember
data Water = Bubble | WaterGun
class Elements a
instance Elements Fire
instance Elements Water
data Elemental = Elemental { name :: String,
move :: (Elements a) => a
}
So, the idea was that "move" in the data constructor "Elemental"
would be able to take any value from either the type Fire or Water.
However, the error message tells me this is an illegal polymorphic type.
Therefore, I tried creating a function that could read my value for me
after "show" was applied to the move. Hence, the data declaration for
Elemental could now assign "move" to a String. The function looked like
this:
Code:
getMove :: (Elements b) => String -> b
getMove x = read x :: (Elements a) => a
This will not work either, as the function "read" complains of
ambiguity in the letter a. I also tried this (amongst other attempts)
Code:
getMove :: (Elements b) => String -> b
getMove "Burn" = Burn
getMove "Ember" = Ember
getMove "Bubble" = Bubble
getMove "WaterGun" = WaterGun
getMove _ = error "Unknown move!"
The above caused the function to infer the type Fire, and then
complain about the type Water. So, how can I either create a function
that can return multiple types like I am trying to above, or is there a
way to adjust the data declaration for Elemental?
Also, I have noticed that 3 :: (Num a) => a will work but Burn :: (Elements a) => a causes an ambiguity error. Why is this the case?
Please help!
Mike
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100820/4f26ad18/attachment.html
More information about the Beginners
mailing list