2013-03-16 8 views
7

suonare in giro per ghci ho ottenuto la seguente espressione: unlines . map (\(a,b) -> show a ++ " " ++ show b)Perché il cambiamento della firma, dopo un incarico

Ora quando posso controllare tramite :t ottengo:

> :t unlines . map (\(a,b) -> show a ++ " " ++ show b) 
unlines . map (\(a,b) -> show a ++ " " ++ show b) 
    :: (Show a, Show a1) => [(a, a1)] -> String 

Quindi, esattamente come previsto. Ma ora se cerco di assegnarlo a un nome, ho una firma più specifica quello originario:

> let f = unlines . map (\(a,b) -> show a ++ " " ++ show b) 
> :t f 
f :: [((),())] -> String 

Perché accade questo?

+1

Vedere anche: [1] (http://stackoverflow.com/questions/7055146), [2] (http://stackoverflow.com/questions/11439163), [3] (http: // stackoverflow. it/questions/9714697), [4] (http://stackoverflow.com/questions/8434808), [5] (http://stackoverflow.com/questions/7799345), [6] (http: // stackoverflow .com/questions/8262020), [7] (http://stackoverflow.com/questions/8655900), [8] (http://stackoverflow.com/questions/11003535). Onestamente non sono sicuro di quale (se esiste) di questi per contrassegnare questo un duplicato di. –

risposta

12

causa della monomorphism restriction, definizioni delle forma x = ... (parametri) viene dato un monomorfico (cioè non polimorfica) tipo, che di solito comporta alcuni moroso come menzionato in the other answer.

Per evitare che ciò accada, aggiungere una firma del tipo alla definizione o disabilitare la restrizione del monomorfismo utilizzando :set -XNoMonomorphismRestriction. Puoi aggiungerlo al tuo .ghci file per farlo funzionare automaticamente all'avvio fino al it gets disabled by default in GHCi in some future version.

+1

o eta espandere; Ad esempio: let f x = non allineati. map (\ (a, b) -> mostra a ++ "" ++ mostra b) $ x' – luqui

4

Regole di default.

Quando si digita materiale in GHCi, tenta di applicare i tipi predefiniti. IIRC, per le cose con un vincolo Num seleziona Integer, per Fractional prende il numero Double e per tutto il resto esso preleva ().

Se si scrive questo in un file sorgente Haskell e lo si carica in GHCi, ciò non accade (credo).

Penso che si possa anche dire qualcosa come default Int per modificare le regole di default per modulo.

Problemi correlati