2013-03-19 8 views
16

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!

+8

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

+2

@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. " –

Antwort

22

Sie benötigen die Eq Einschränkung, da Sie überprüfen, ob h-23 oder 12 und ob m gleich ist, gleich 59. Sie tun es mit Mustererkennung, nicht ==, aber Mustervergleich mit numerischen Literalen auf diese Weise erfordert immer noch Eq (im Gegensatz zum Mustervergleich gegen Konstruktoren).

+1

O.K. Ich verstehe, danke für deine Erklärungen! – vildric

Verwandte Themen