[Haskell-cafe] Adding Ord constraint to instance Monad Set?

Wolfgang Jeltsch wolfgang at jeltsch.net
Wed Mar 31 15:56:05 EST 2004


Am Mittwoch, 31. März 2004 15:42 schrieb MR K P SCHUPKE:
> > 	data Either a =3D
> > 		Num a =3D> Left a
> > 		Ord a =3D> Right a
>
> This is a mistake because the same variable is being constrained in
> two different ways. The only way both constrains can be satisfied
> is if a is both in Num and Ord. This can be written:
>
> 	data (Num a,Ord a) => Either a = Left a | Right a
>
> Which makes it a lot clearer that the constaints apply to both
> the Left and Right constructor.
>
> You have to remember that a is a polymorphic variable... now the
> first line [Num a => Left a] says that a has the type (forall a . Num a)
> but the second line [Ord a => Right a] says a has the type (forall a . Ord
> a) These are not the same type, so when they are combined (remember a
> scopes over the whole type definition) there is a type error because:
>
> 	(forall a . Ord a) is not the same as (forall a . Num a)
>
> 	Regards,
> 	Keean.

My intention was that the context before a data constructor shall mean that 
the variable (a) shall be constrained only in the type of the constructor 
function, not in the type definition.

In a way, even in Haskell 98, (a) is only constrained in the type of the 
constructor function.  Saying "a is constricted for the whole type 
definition." would suggest that Either can only be applied to Ord instances 
which isn't true as we have seen.

Wolfgang



More information about the Haskell-Cafe mailing list