Also, ich habe eine sehr einfache Funktion, die zwei Parameter nehmen: der erste ist eine Stunde (zwischen 0 und 23) und der zweite ist eine Minute (zwischen 0 und 59). Diese Funktion gibt die Stunde plus eine Minute zurück und formatiert die Stunde in einem schönen Stil. Zum Beispiel hour 11 12
zurück 11 heures et 13 minutes
. Entschuldigung für das französische Format der Stunde.Warum die Einschränkung "Eq" hinzufügen, ohne "==" zu verwenden?
Also verwende ich in dieser Funktion die show
Funktion, und die Parameter müssen eine Nummer sein, so habe ich die Typ-Deklaration (Num a, Show a) => a -> a -> String
. Aber, wenn ich die Funktion versuche, habe ich einen Fehler und GHC sagen zu mir, die Eq
Typ Einschränkung hinzufügen, aber ich verstehe nicht, warum ich die Eq
Art Einschränkung in diesem Fall brauche. Es ist der Code (wieder, sorry für die französisch Text in der Funktion verwendet, aber ich denke, dass es nicht sehr wichtig ist, wenn Sie den Namen der Funktion und den Text nicht verstehen):
heure :: (Num a, Eq a, Show a) => a -> a -> String
heure 23 59 = "Minuit"
heure 12 m = "Midi et " ++ show (m+1) ++ " minutes"
heure h 59 = show (h+1) ++ " heures"
heure h m = show h ++ " heures et " ++ show (m+1) ++ " minutes"
Also: wenn ich Verwenden Sie nicht Eq
, ich habe einen Fehler und wenn ich es verwende, ist mein Code korrekt. Warum?
Vielen Dank für Ihre Erläuterungen!
Die Übereinstimmung eines numerischen, Zeichen- oder String-Literalmusters k mit einem Wert v ist erfolgreich, wenn v == k, wobei == basierend auf dem Typ des Musters überladen ist. Siehe [Haskell 2010 Language Report 3.17.2 Informelle Semantik der Mustererkennung] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17) – nymk
@nymk: [Abschnitt 6.4 des Berichts 2010] (http://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1350006.4) sagt "[t] er Klasse' Num' von numerischen Typen ist eine Unterklasse von 'Eq', da alle Zahlen verglichen werden können für die Gleichheit. " Aber was hier passiert ist, dass [neuere Versionen von GHC es nicht tun] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/release-7-4-1.html): "Die' Num'-Klasse hat keine 'Eq'- oder 'Show'-Oberklassen mehr. Eine Reihe anderer Klassen und Funktionen haben daher explizite' Eq'- oder 'Show'-Einschränkungen erhalten, anstatt sich auf eine' Num'-Einschränkung zu verlassen stelle sie dir zur Verfügung. " –