I think it's more like the non-keyworded default definitions of class methods, for the same reasons; the default definition has to potentially be valid for all instances of the class.It's the difference betweenclass Applicative m => Monad m wherereturn :: a -> m areturn = pure -- always valid, but can be overridden in instance declarationsandclass Fuctor f => Applicative f where(<*>) :: f (a -> b) -> f a -> f bdefault (<*>) :: Monad f => f (a -> b) -> f a -> f b(<*>) = ap -- only valid if matches the type signature above