2013-03-16 2 views
7

Herumspielen in ghci ich den folgenden Ausdruck bekam: unlines . map (\(a,b) -> show a ++ " " ++ show b)Warum Unterschrift Wechsel nach einer Zuweisung

Nun, wenn ich es über :t überprüfen ich:

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

So genau wie erwartet. Aber jetzt, wenn ich versuche, es zu einem gewissen Namen zuweisen, erhalte ich eine spezifische Signatur als das Original:

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

Warum geschieht das?

+1

Siehe auch: [1] (http://stackoverflow.com/questions/7055146), [2] (http://stackoverflow.com/questions/11439163), [3] (http: // stackoverflow. com/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). Ich bin mir ehrlich gesagt nicht sicher, welche (wenn überhaupt) von diesen ein Duplikat von. –

Antwort

12

Wegen der monomorphism restriction, Definitionen der Form x = ... (ohne Parameter), um eine monomorphe gegeben sind (das heißt nicht-polymorphe) Typs, die in der Regel wie erwähnt einige in the other answer säumige beinhaltet.

Um dies zu verhindern, fügen Sie entweder eine Typ-Signatur zu Ihrer Definition hinzu oder deaktivieren Sie die Monomorphie-Einschränkung mit :set -XNoMonomorphismRestriction. Sie können dies zu Ihrem .ghci file hinzufügen, damit es automatisch beim Start bis it gets disabled by default in GHCi in some future version läuft.

+1

Oder eta erweitern; d.h., let fx = unlines. map (\ (a, b) -> zeige a ++ "" ++ zeige b) $ x' – luqui

4

Standardregeln.

Wenn Sie stuff in GHCi eingeben, wird versucht, Standardtypen anzuwenden. IIRC, für Dinge mit einer Num Einschränkung wählt es Integer, für Fractional wählt es Double, und für alles andere wählt es ().

Wenn Sie dies in einer Haskell-Quelldatei schreiben und in GHCi laden, passiert das (glaube ich) nicht.

Ich denke, Sie können auch etwas wie default Int sagen, um die Standardregeln pro Modul zu ändern.