two easy questions

Mike T. Machenry dskippy@ccs.neu.edu
Fri, 21 Feb 2003 00:14:04 -0500


Hmm, that does seem like alot of code to say such a little thing. Is it
possible to come at the problem from the other direction? By this I mean I
am trying to have two sets of symbols be enumerated together. This solution
I asked for tries to impose the enumeration over the data. Can I define

data Player = Red | Green | Blue | MrX deriving (Enum)

and then use type classes or something else to say that MrX is a fugitive and
the others are detectives such that I can pattern match on them? I have
functions that recur over the Player argument and terminate at MrX, but I also
want to be able to formally say that some functions cannot take a player that
is Mrx, or can only take Mrx.

-mike

On Thu, Feb 20, 2003 at 12:35:44PM -0500, Dean Herington wrote:
> 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
> 
> _______________________________________________
> Haskell mailing list
> Haskell@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell