[Haskell-beginners] Data Class problem

Jonas Almström Duregård jonas.duregard at chalmers.se
Fri Aug 20 07:08:52 EDT 2010


Not sure if this helps, but when you have

move :: Elements a => a

It doesn't mean move will return some unknown Elements type, it means you
can choose any type which is a member of elements and move will return that
type.

This means that

Burn :: Elements a => a

implies

Burn :: Water

Which is wrong.

3 :: Double
3 :: Integer

are both correct on the other hand.

/J


On 20 August 2010 10:58, Michael Bradley <michael.bradley at hotmail.co.uk>wrote:

>  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
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100820/30954259/attachment.html


More information about the Beginners mailing list