Let\'s consider a data type with many constructors:
data T = Alpha Int | Beta Int | Gamma Int Int | Delta Int
I want to write a function to che
Look at the Data.Data module, the toConstr
function in particular. Along with {-# LANGUAGE DeriveDataTypeable #-}
that will get you a 1-line solution which works for any type which is an instance of Data.Data
. You don't need to figure out all of SYB!
If, for some reason (stuck with Hugs?), that is not an option, then here is a very ugly and very slow hack. It works only if your datatype is Show
able (e.g. by using deriving (Show)
- which means no function types inside, for example).
constrT :: T -> String
constrT = head . words . show
sameK x y = constrT x == constrT y
constrT
gets the string representation of the outermost constructor of a T
value by showing it, chopping it up into words and then getting the first. I give an explicit type signature so you're not tempted to use it on other types (and to evade the monomorphism restriction).
Some notable disadvantages:
data T2 = Eta Int | T2 :^: T2
)show
, such as many library types.That said, it is Haskell 98... but that's about the only nice thing I can say about it!