[Haskell-cafe] Circular enums - resend

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


[Resending 
with 
formatting 
fixed.]

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