2015-07-05 14 views
8

Kann jemand bitte erklären, was ich hier fehlt:In Bezug auf Haskell Typklassen (Num vs Read)

Prelude> :t read 
read :: (Read a) => String -> a 
Prelude> read "4" 

<interactive>:1:0: 
    Ambiguous type variable `a' in the constraint: 
     `Read a' arising from a use of `read' at <interactive>:1:0-7 
    Probable fix: add a type signature that fixes these type variable(s) 

read "4" löst einen Fehler als GHCI nicht, welche konkreten Typ nicht wissen, dass wir wollen, es weiß nur, dass wir haben Sie eine Read Typklasse. read "4" :: Int funktioniert gut. Das ist mir klar.

Jetzt, nach der obigen Logik, erwartete ich fromIntegral 4 einen Fehler zu erhöhen:

Prelude> :t fromIntegral 
fromIntegral :: (Integral a, Num b) => a -> b 
Prelude> fromIntegral 4 
4 

aber es funktioniert gut. Warum wird in diesem Fall keine Typennummerierung benötigt? Ich habe erwartet, dass das oben genannte fehlschlägt; und NUR

Prelude> fromIntegral 4 :: Int 

zu arbeiten.

NB - Ich lese "Lernen Sie ein Haskell für großes Gutes" und habe bis Kapitel 5 behandelt. Ist das, was ich frage, in Kapitel 7 (oder einem anderen Kapitel) diskutiert?

Danke.

Antwort

12

Es funktioniert wegen type defaulting, die mehrdeutige Typ Variablen standardmäßig Integer oder Double (oder eine andere benutzerdefinierte Standard) wird. Dies geschieht nur für Num und seine Unterklassen.

In GHCi, the rules for defaulting are relaxed auch für Show, Eq und Ord, zu arbeiten und auch () auf der Liste der Standardtypen hinzugefügt. Dies ermöglicht Ausdrücke wie [] == [] zu überprüfen.

4

Der Unterschied besteht darin, dass Lesen möglicherweise zu einem beliebigen Typ führen kann, während von Integral eine Zahl ergibt. Es gibt einige Fehler in Bezug auf Zahlen in ghci, sodass ghci einfach den Standardtyp verwenden kann.