
Ben,
I often find it useful to determine whether two objects are using the same constructor, without worrying about the constructors' arguments.
In Generic Haskell, you can define shallowEq, well ;), generically: shallowEq {| a :: * |} :: (shallowEq {| a |}) => a -> a -> Bool shallowEq {| Unit |} Unit Unit = True shallowEq {| Sum a b |} (Inl _) (Inl _) = True shallowEq {| Sum a b |} (Inr _) (Inr _) = True shallowEq {| Sum a b |} _ _ = False shallowEq {| Prod a b |} (_ :*: _) (_ :*: _) = True shallowEq {| Int |} n1 n2 = n1 == n2 shallowEq {| Char |} c1 c2 = c1 == c2 There are some more lightweight variations of this style of programming that can be embedded in Haskell, but they require some additional effort per data type. I'm not sure how this can be done with the Scrap Your Boilerplate approach, i.e., I have not give it too much thought yet, but I'm sure something can be done there too. Regards, Stefan