type data custom argument haskell types type-inference type-systems

data - ord haskell



¿Cómo es el tipo de `([]==)[]` haskell inferido? (2)

Suena tonto, pero no lo consigo. ¿Por qué se puede escribir la expresión [] == []? Más específicamente, ¿qué tipo (en la clase Eq) se infiere al tipo de elementos de lista?

En una sesión de ghci, veo lo siguiente:

Prelude> :t (==[]) (==[]) :: (Eq [a]) => [a] -> Bool

Pero la restricción Eq [a] implica Eq a también, como se muestra aquí:

Prelude> (==[]) ([]::[IO ()]) <interactive>:1:1: No instance for (Eq (IO ())) arising from use of `=='' at <interactive>:1:1-2 Probable fix: add an instance declaration for (Eq (IO ())) In the definition of `it'': it = (== []) ([] :: [IO ()])

Por lo tanto, en [] == [], el verificador de tipos debe asumir que el elemento de lista es algún tipo a que está en la clase Eq. ¿Pero cual? El tipo de [] es solo [a], y esto es ciertamente más general que la ecuación a => [a].

En mi humilde opinión esto debería ser ambiguo, al menos en Haskell 98 (de lo que estamos hablando)


GHC infiere el tipo más general:

(== []) :: (Eq a) => [a] -> Bool

Debe leerse como

  • Si tienes una instancia de la ecuación a,
  • entonces Haskell puede darte una función de las listas de esos ''a'' a Bool

Entonces, sí, la implicación aquí es que tiene una instancia de la ecuación para los elementos de la lista, y GHC ya tiene una instancia para las listas en general (confiando en la ecuación para los elementos), así que obtenemos un buen tipo general.

El verificador de tipos "asume" que puede proporcionar una instancia de Eq cuando se llama a un tipo en particular.

No puedo reproducir los resultados de tener una restricción Eq [a] .


GHCi tiene reglas extendidas para el tipo predeterminado, que es lo que te hizo tropezar. En este caso, creo que por defecto el tipo ambiguo a () . Las formas sutiles en las que GHCi se comporta de manera diferente son agradables en aras de una mejor interactividad, pero en ocasiones resultan en confusión ...