2012-04-25 9 views
5

Che cosa sta succedendo esattamente con quanto segue?Quando la riduzione di eta può cambiare il tipo di una funzione?

> let test = map show 

> :t test 
test :: [()] -> [String] 

> :t (map show) 
(map show) :: Show a => [a] -> [String] 

Mi chiedo come non l'ho notato prima? In realtà ho riscontrato il problema con "map fromIntegral" piuttosto che show - il mio codice non viene compilato con la forma pointfree, ma funziona bene senza riduzione di eta.

Esiste una semplice spiegazione di quando la riduzione di eta può modificare il significato del codice Haskell?

risposta

11

Questo è il monomorphism restriction, che si applica quando un'associazione non accetta parametri e consente al bind di essere condivisibile quando altrimenti non sarebbe dovuto al polimorfismo, in base alla teoria che se non si specifica un parametro vuoi trattarlo come qualcosa di "costante" -ish (quindi condiviso). Puoi disabilitarlo in ghci con :set -XNoMonomorphismRestriction; questo è spesso utile in ghci, dove spesso si intende che tali espressioni siano completamente polimorfiche. (In un file sorgente Haskell, fare la prima linea di

{-# LANGUAGE NoMonomorphismRestriction #-} 

invece.)

+0

WOW mi dispiace, avrebbe dovuto sapere. Avevo persino provato il pragma della lingua ma avevo dimenticato di includere i segni dell'hash e GHC non stava dicendo la solita cosa sulla "probabile causa". – sacheie

+9

Per essere precisi è la limitazione del monomorfismo combinata con le regole estese di default di GHCi. – sepp2k

Problemi correlati