[Haskell-cafe] Circular enums

Ben Butler-Cole ben at bridesmere.com
Sat Feb 2 18:41:16 EST 2008


Hello

I'm 
trying 
to 
define 
functions 
that 
allow 
you 
to 
traverse 
a 
bounded 
enumeration, 
"wrapping" 
at 
the 
start 
and 
the 
end.

My implementation looks like this:

    next, 
prev 
:: 
(Enum 
a, 
Bounded 
a) 
=> 
a 
-> 
a
    next 
= 
turn 
1
    prev 
= 
turn 
(-1)

    turn 
:: 
(Enum 
a, 
Bounded 
a) 
=> 
Int 
-> 
a 
-> 
a
    turn 
n 
e 
= 
toEnum 
(add 
(fromEnum 
(maxBound::a) 
+ 
1) 
(fromEnum 
e) 
n)
      
  
where
      
  
  
add 
mod 
x 
y 
= 
(x 
+ 
y 
+ 
mod) 
`rem` 
mod

Which fails to type check under GHC with this error:

    No instance for (Bounded a)
      arising from use of `maxBound' at Hbot.hs:6:34-41
    Probable fix: add (Bounded a) to the expected type of an expression
    In the expression: maxBound :: a
    In the first argument of `fromEnum', namely `(maxBound :: a)'
    In the first argument of `(+)', namely `fromEnum (maxBound :: a)'

My (clearly flawed) understanding of the signature I've specified for 'turn' means *exactly* that a is Bounded.

Can anyone enlighten me as to where my understanding is going awry and how (whether) I can achieve what I'm trying to do.

Thank you 
Ben




More information about the Haskell-Cafe mailing list