[Haskell] GHC / Hugs Disagree on Constraints

Dominic Steinitz dominic.steinitz at blueyonder.co.uk
Sat Oct 9 06:05:16 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
> Haskell98: introduce two functions
> 
> 
>>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,

Did you get the first solution to work? When I tried it with hugs -98 I got

ERROR "Codec/Encryption/LargeKey.hs":109 - Syntax error in input 
(unexpected `=')

ghc with -fglasgow-exts accepts it.

Dominic.




More information about the Haskell mailing list