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 | [EMAIL PROTECTED] > > 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 > [EMAIL PROTECTED] > http://www.haskell.org/mailman/listinfo/haskell _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
