Clases de tipo y sobrecarga, ¿cuál es la conexión?

Actualmente estoy tratando de entender las clases de tipos y las instancias y todavía no entiendo el punto. Tengo dos preguntas sobre el asunto hasta ahora:

1) ¿Por qué es necesario tener una clase de tipo en una firma de función cuando la función utiliza alguna función de esa clase de tipo? Ejemplo:

f :: (Eq a) => a -> a -> Bool
f a b = a == b

¿Por qué poner(Eq a) en la firma Si== no está definido paraa entonces, ¿por qué no simplemente lanzar el error al encontrara == b? ¿Cuál es el punto de tener que declarar la clase de tipo por delante?

2) ¿Cómo se relacionan las clases de tipos y la sobrecarga de funciones?

No es posible hacer esto:

data A = A
data B = B

f :: A -> A
f a = a

f :: B -> B
f b = b

Pero es posible hacer esto:

data A = A
data B = B

class F a where
  f :: a -> a

instance F A where
  f a = a

instance F B where
  f b = b

¿Qué pasa con eso? ¿Por qué no puedo tener dos funciones con el mismo nombre pero operando en diferentes tipos ... Viniendo de C ++ me parece muy extraño. Pero probablemente tengo conceptos erróneos sobre lo que realmente son estas cosas. pero una vez que los envuelvo en estas cosas de instancia de clase de tipo que puedo.

No dude en lanzarme palabras teóricas de categoría o tipo, ya que estoy aprendiendo sobre estos temas en paralelo al aprendizaje de Haskell y sospecho que hay una base teórica en ellos sobre cómo Haskell hace las cosas aquí.

Respuestas a la pregunta(4)

Su respuesta a la pregunta