[Haskell-cafe] Writing guards shorthand
Jules Bean
jules at jellybean.co.uk
Thu Apr 19 09:17:10 EDT 2007
Neil Mitchell wrote:
> Hi
>
> isBool x = isLT x || isGT x
> isNum x = not $ isBool x
>
> isLT and isGT can be derived automatically using derve [1], with the
> Is class (or DrIFT if you want).
You can also get a long way with GHC's built in derivations for Eq, Enum
and Show.
If an Enum instance is possible then you can write something like
isBool = (`elem` [LT .. GT])
isNum = (`elem` [Minus .. Mul])
If enum is not possible, because some of the constructors are not
nullary, then there is the following cute/ugly hack if you instead
derive Show:
constrName = takeWhile (/=' ') . show
and you can say
isBool x = constrName x `elem` ["LT","GT"]
isNum x = constrName x `elem` ["Minus","Plus","Mul"]
What this leads us towards is that it might be rather nice (perhaps even
nice enough to build into a compiler) to be able to derive, for each
type with multiple constructors, a type 'which is the enumeration of the
constructors'. I.e. a type with the same constructors (up to some
namespace fix like prepending with C) but all nullary:
data Atom = Null | MyInt Int | MyString String
derives...
data AtomCons = CNull | CMyInt | CMyString deriving (Ord,Eq,Enum,Show)
and a function
constr :: Atom -> AtomCons
Jules
More information about the Haskell-Cafe
mailing list