folgenden Haskell Funktion vor:(Num a) vs Integer Typinferenz
es als gefolgertsign :: (Num a, Ord a) => a -> Integer
Statt:
sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0
Als ich dies in GHCI ich :t sign
zu erwarten laden
Ähnlich, wenn ich nach dem Typ der Ganzzahl 5
frage, erwartete ich Integer
, aber stattdessen habe ich
*Main> :t 5
5 :: Num a => a
Es gibt etwas, was ich verstehe mich nicht über Haskell-Typen. Die Sache ist, wenn alles, was ich über die Rückkehr Art von sign
wissen ist, dass es eine Instanz des Num
typeclass ist, dann soll ich nicht in der Lage sein, ihren Rückgabewert in diese Funktion zu übergeben:
double :: Integer -> Integer
double x = x * 2
Das heißt, Meine double
Funktion erfordert eine Integer
, nicht irgendeine Instanz von Num
.
Doch die folgenden funktioniert gut:
*Main> double (sign 5.5)
2
Was ist das, was ich bin falsch Verständnis über Haskell Typ-System?
Übrigens gibt es natürlich auch die Funktion 'signum :: Num a => a -> a ', d. H. Sie geben eine Zahl hinein und erhalten eine Zahl * des gleichen Typs * zurück. – mrueg
Die Tatsache, dass Sie es an "double" weitergegeben haben, gibt der Typ-Inferenz-Engine mehr Wissen - es weiß, dass es mit "double" funktioniert, und ermittelt, wie das möglich gemacht wird. – jpaugh