Oh wait I see, I can write an implementation for "(==)" using "eq1": import Data.Functor.Classes (Eq1, eq1) -- Library function, cannot be modified allEqual :: (Eq a) => [a] -> Bool allEqual [] = True allEqual (x : xs) = all (== x) xs func :: (Eq a, Eq1 f) => [f a] -> Bool func xs = allEqual (map F1 xs) newtype F1 f a = F1 (f a) instance (Eq1 f, Eq a) => Eq (F1 f a) where (F1 x) == (F1 y) = eq1 x y