2013-03-19 9 views
16

Quindi, ho una funzione molto semplice che prende due parametri: il primo è un'ora (tra 0 e 23) e il secondo è un minuto (tra 0 e 59). Questa funzione restituisce l'ora più un minuto e formatta l'ora in un bellissimo stile. Ad esempio, hour 11 12 restituisce 11 heures et 13 minutes. Ci scusiamo per il formato francese dell'ora.Perché aggiungere un vincolo di tipo "Eq" senza utilizzare "=="?

Quindi, io uso in questa funzione la funzione show ei parametri devono essere un numero, quindi ho la dichiarazione di tipo (Num a, Show a) => a -> a -> String. Ma, quando provo la funzione, ho ricevuto un errore e GHC mi ha detto di aggiungere il vincolo di tipo Eq, ma non capisco perché ho bisogno del vincolo di tipo Eq in questo caso. C'è il codice (di nuovo, mi spiace per il testo francese utilizzato nella funzione, ma penso che non è molto importante se non si capisce il nome della funzione e il testo):

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" 

Quindi: se io non utilizzare Eq, ho un errore e quando lo uso il mio codice è corretto. Perché?

Grazie per le vostre spiegazioni!

+8

La corrispondenza di un modello letterale numerico, di carattere o di stringa k su un valore v ha esito positivo se v == k, dove == è sovraccaricato in base al tipo del motivo. Vedi [Rapporto linguistico Haskell 2010 3.17.2 Semantica informale di Pattern Matching] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-580003.17) – nymk

+2

@nymk: [Sezione 6.4 del Rapporto 2010] (http://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1350006.4) dice "[t] he la classe' Num' dei tipi numerici è una sottoclasse di 'Eq', poiché tutti i numeri possono essere confrontati per l'uguaglianza. " Ma quello che sta succedendo qui è che [le versioni recenti di GHC non lo fanno] (http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/release-7-4-1.html): "La classe' Num' non ha più le superclassi 'Eq' o' Show'. Un certo numero di altre classi e funzioni hanno quindi ottenuto vincoli 'Eq' o' Show' espliciti, piuttosto che affidarsi a un vincolo 'Num' per fornire loro. " –

risposta

22

è necessario il vincolo Eq perché si sta verificando se h è uguale a 23 o 12 e se m è uguale a 59. Lo stai facendo utilizzando la corrispondenza dei pattern, non ==, ma la corrispondenza dei pattern rispetto ai letterali numerici in questo modo richiede ancora Eq (a differenza della corrispondenza dei modelli con i costruttori).

+1

O.K. Capisco, grazie per le tue spiegazioni! – vildric

Problemi correlati