Suena tonto, pero no puedo entenderlo. ¿Por qué la expresión [] == [] se puede escribir? Más específicamente, ¿qué tipo (en la clase Eq) se deduce del tipo de elementos de lista?¿Cómo es el tipo de `([] ==) []` inferido haskell?
En una sesión 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()])
Así, en [] == [] , el verificador de tipos debe asumir que el elemento de lista es de 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 Eq a => [a].
mi humilde opinión, esto debería por ambigua, al menos en Haskell 98 (que es lo que estamos hablando)
Con GHC (no GHCi) tengo 'Variable de tipo ambiguo \ 'a' en la restricción \ 'Eq a' que surge de un uso de \ '== '' – kennytm
@Kenny - sí, eso es lo que esperaba antes de probar en ghci - mayor es mi sorpresa. Gracias por la pista, ahora mi orden mundial está restaurada :) – Ingo
Es interesante Abrazos da la expresión '[] == []' tipo 'Eq a => Bool'. – sdcvvc