Search code examples
haskellghcexistential-type

Testing equality between two heterogeneous values


I'm using the -XExistentialQuantification GHC extension to create a heterogeneous container for values of a specific type class (Shape):

-- Container type
data Object = forall a. Shape a => Object a

-- 'Shape' class. Methods not important
class Eq s => Shape s where
    doStuff :: s -> s

Given that all instances of Shape are also instances of Eq, is there a way to make Object an instance of Eq as well?


Solution

  • It's possible if you add a Typeable constraint:

    import Data.Typeable
    
    data Object = forall a. (Shape a, Typeable a) => Object a
    
    instance Eq Object where
      Object x == Object y =
        case cast y of
          Just y' -> x == y'
          Nothing -> False 
    

    Here, cast y will return Just y' if the desired type of y' (inferred from the use of == with x) matches the actual type of y, and Nothing otherwise.