
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