Si tratta di un errore nel correttore di tipi?Errore di tipo durante l'attribuzione di un tipo forall valido a una variabile let-bound
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
Il fatto che quanto sopra non riesce a digitare controllo, ma questa contorsione riesce:
Prelude> let (x :: (forall a. a -> a) -> Int) = (\f -> f 3) in x id
3
mi porta a pensare che "la conversione prenessa debole" (vedere a pagina 23 del this paper) potrebbe essere correlato in qualche modo . Incorporare un forall
in una posizione controvariante in cui non può essere "fluttuato" sembra tenerlo al sicuro da questo errore strano.
Interessante. Viene visualizzato un messaggio di errore diverso su GHC 6.12.1: "Il tipo dedotto è meno polimorfico del previsto. Variabile di tipo quantificata 'a' scappa nell'espressione: id". – hammar
Sto usando GHC 7.2.1, FWIW. –
Potrei sbagliarmi (sono su un vecchio GHC), ma non è legale Haskell 98/2010. Su quali estensioni hai? Questo potrebbe spiegare cosa sta succedendo. (Ricevo lo stesso errore di hammar, quindi il problema potrebbe essere che 'a' non significa quello che ti aspetti.) –