¿Esto es un error en el comprobador de tipos?Escriba error al atribuir un tipo de campo válido a una variable de límite
Prelude> let (x :: forall a. a -> a) = id in x 3
<interactive>:0:31:
Couldn't match expected type `forall a. a -> a'
with actual type `a0 -> a0'
In the expression: id
In a pattern binding: (x :: forall a. a -> a) = id
El hecho de que lo anterior falla al tipo de comprobación, pero esta contorsión tiene éxito:
Prelude> let (x :: (forall a. a -> a) -> Int) = (\f -> f 3) in x id
3
me lleva a pensar que "débil conversión prenex" (ver la página 23 de this paper) podría estar relacionado de alguna manera . Incrustar un forall
en una posición contravariante donde no puede "flotar" parece mantenerlo a salvo de este extraño error.
Interesante. Aparece un mensaje de error diferente en GHC 6.12.1: "El tipo inferido es menos polimórfico de lo esperado. La variable de tipo cuantificada 'a' se escapa en la expresión: id". – hammar
Estoy usando GHC 7.2.1, FWIW. –
Puedo estar equivocado (estoy en un GHC antiguo), pero eso no es legal Haskell 98/2010. ¿Qué extensiones tienes? Eso podría explicar lo que está pasando. (Recibo el mismo error que Hammar, por lo que el problema podría ser que 'a' no significa lo que espera). –