# [Haskell] GHC / Hugs Disagree on Constraints

Dominic Steinitz dominic.steinitz at blueyonder.co.uk
Tue Oct 5 13:37:21 EDT 2004

```oleg at pobox.com wrote:
>>instance (Ord a, Bits a, Bounded a, Integral a, LargeWord a,
>>                  Bits b, Bounded b, Integral b, LargeWord b) =>
>>    Bounded (LargeKey a b) where
>>       minBound = 0
>>       maxBound =
>>          fromIntegral \$
>>          (1 + fromIntegral (maxBound::b))*
>>             (1 + fromIntegral (maxBound::a)) - 1
>>
>>Hugs rejects it with +N -98 with
>
>
> One fix is to bring type variables into the local scope, for
> example,
>
>
>>instance (Ord a, Bits a, Bounded a, Integral a, LargeWord a,
>>                  Bits b, Bounded b, Integral b, LargeWord b) =>
>>    Bounded (LargeKey a b) where
>>       minBound = 0
>>       maxBound :: (LargeKey a b) =
>>          fromIntegral \$
>>          (1 + fromIntegral (maxBound::b))*
>>             (1 + fromIntegral (maxBound::a)) - 1
>
>
> You still need -98 flag for Hugs. Another solution is totally
>
>
>>aoflk:: (LargeKey a b) -> a; aoflk = undefined
>>boflk:: (LargeKey a b) -> b; boflk = undefined
>
>
> then maxBound can be implemented as
>
>
>>       maxBound = result where
>>         result =
>>          fromIntegral \$
>>          (1 + fromIntegral (maxBound `asTypeOf` (boflk result)))*
>>             (1 + fromIntegral (maxBound `asTypeOf` (aoflk result))) - 1
>
>
> The apparent recursion in the above definition is superficial. The
> definition isn't actually recursive. We merely need the type of the
> 'result' rather than its value.
>
>
>

Oleg,

Thanks for this. It seems strange that the scope of the universal
quantifier is the function definition (in your first solution) rather
than the whole of the instance.