two easy questions
Dean Herington
heringto@cs.unc.edu
Thu, 20 Feb 2003 12:35:44 -0500
You can't derive Enum Player automatically, but you can program it. Here's one
way how, using shorter example names.
-- Dean
data E1 = E1a | E1b | E1c deriving (Enum, Bounded, Show, Read)
data E2 = E2a | E2b | E2c deriving (Enum, Bounded, Show, Read)
data E = E1 E1 | E2 E2 deriving (Show, Read)
instance Enum E where
fromEnum (E1 e1) = fromEnum e1
fromEnum (E2 e2) = size_E1 + fromEnum e2
toEnum i | i < size_E1 = E1 (toEnum i)
| otherwise = E2 (toEnum (i - size_E1))
instance Bounded E where
minBound = toEnum 0
maxBound = toEnum (size_E1 + size_E2)
size_E1 = fromEnum (maxBound :: E1) + 1
size_E2 = fromEnum (maxBound :: E2) + 1
Hal Daume III wrote:
> succ Blue cannot return MrX unless Blue and MrX have the same type. What
> I meant was that you would say:
>
> 'succ (Detective Red)' ==> Detective Green
> 'succ (Detective Green)' ==> Detective Blue
> 'succ (Detective Blue)' ==> Fugitive MrX
>
> --
> Hal Daume III
>
> "Computer science is no more about computers | hdaume@isi.edu
> than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume
>
> On Thu, 20 Feb 2003, Mike T. Machenry wrote:
>
> > I tried this. It doesn't work. succ Blue is an exception. Anybody else know
> > how this should be done?
> >
> > Thanks,
> > -mike
> >
> > On Thu, Feb 20, 2003 at 08:00:04AM -0800, Hal Daume III wrote:
> > > > Question 1: Is there an easier, more elegant way to write this code?
> > >
> > > For the most part, no.
> > >
> > > > Question 2: Is there a way to express the following relationship?
> > > > I want to have a set of symbols with ordering and another set that is
> > > > part of that ordering but with a different parent. For exammple,
> > > >
> > > > data Player = Detective | Fugitive deriving (Enum)
> > > > data Detective = Red | Green | Blue deriving (Enum)
> > > > data Fugitive = MrX deriving (Enum)
> > >
> > > How about something like:
> > >
> > > > data Player = Detective Detective | Fugitive Fugitive deriving (Enum)
> > > > data Detective = Red | Green | Blue deriving (Enum)
> > > > data Fugitive = MrX deriving (Enum)
> > >
> > > (I'm not sure if the deriving Enum on Player will be exactly what you want
> > > -- I think so though. I don't derive this class very often.)
> > >
> > > Then you can test detectiveness by:
> > >
> > > > isDetective (Detective _) = True
> > > > isDetective _ = False
> > >
> > > HTH
> > >
> > > - Hal