En realidad no arroja resultados de tipos distintos. Veamos el código:
data C a = C (Bool, a)
foo (C (True, x )) = x
foo (C x ) = (fst x , False)
(cuando aparecen variables de tipos le voy a poner distintos nombres para no confundirlos)
En la primera ecuación podemos deducir que el tipo de foo es C b -> b
En la segunda ecuación podemos deducir que el tipo de foo es C c -> (Bool,Bool)
Si unificamos esos tipo obtenemos las igualdades:
b = c
b = (Bool,Bool)
Entonces el tipo de foo es:
foo :: C (Bool,Bool) -> (Bool,Bool)
saludos