You can do this, as hinted at by Karolis Juodelė, with Data.Typeable
:
Prelude Data.Typeable> :{
Prelude Data.Typeable| let isEq :: (Typeable a , Typeable b) => a -> b -> Bool
Prelude Data.Typeable| isEq x y = typeOf x == typeOf y
Prelude Data.Typeable| :}
Prelude Data.Typeable> isEq True ()
False
Prelude Data.Typeable> isEq True False
True
The question is: Why would you not know at run time what the types are, and then why would you care about whether they are equal – can you elaborate your use case?