On Thu, May 31, 2007 at 06:16:20PM +0100, Jon Harrop wrote:
> > I can't think of a lightweight way to encode overlapping enumerations in
> > Haskell.
>
> I'd like to know if this is possible in Haskell.
Maybe this way using GADTs and typeclasses? I haven't used such code in
practice - there may be some hidden traps.
{-# OPTIONS -fglasgow-exts #-}
module Enum where
data Height
data Size
class HasMEDIUM t
instance HasMEDIUM Height
instance HasMEDIUM Size
data ENUM t where
LOW :: ENUM Height
MEDIUM :: HasMEDIUM t => ENUM t
HIGH :: ENUM Height
SMALL :: ENUM Size
BIG :: ENUM Size
Example use:
*Enum> :t [MEDIUM, LOW]
[MEDIUM, LOW] :: [ENUM Height]
*Enum> :t [MEDIUM, SMALL]
[MEDIUM, SMALL] :: [ENUM Size]
*Enum> :t [MEDIUM, SMALL, LOW]
<interactive>:1:16:
Couldn't match expected type `Size' against inferred type `Height'
Expected type: ENUM Size
Inferred type: ENUM Height
In the expression: LOW
Best regards
Tomek
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe