[EMAIL PROTECTED] 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,

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.

Is asTypeOf really Haskell 98?

Dominic.



_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to