La stringa di confronto normale funziona solo sull'ordinamento lessicografico, non sulla lunghezza delle stringhe.
Quindi dovreste scrivere la propria funzione di controllare anche per la lunghezza:
smaller :: String -> String -> Bool
smaller s1 s2 | length s1 < length s2 = True
| length s1 > length s2 = False
| otherwise = s1 < s2
o un po 'più generale:
compareStrings :: String -> String -> Ordering
compareStrings s1 s2 | length s1 < length s2 = LT
| length s1 > length s2 = GT
| otherwise = compare s1 s2
Esempio:
ghci> compare "ab" "z"
LT
ghci> compareStrings "ab" "z"
GT
Eravamo in giro con i Monoidi a università la settimana scorsa, e ci si avvicinò con questa bella alternativa Ord
esempio:
instance Ord a => Ord [a] where
compare = comparing length
`mappend` comparing head `mappend` comparing tail
Ma se non capisco questo, vi consiglio di bastone con la prima definizione ;-)
fonte
2009-05-04 10:50:03
Questo è ovviamente più veloce della mia versione, dal momento che calcola solo la lunghezza delle stringhe una volta. Probabilmente può essere reso ancora più veloce eseguendo una corrispondenza di pattern diretta sulle stringhe di input, unendo così questa definizione e la definizione della funzione 'length'. –
Haskell si occupa di generalizzazione e buone pratiche di codifica e ha un sistema di tipo (classe) molto buono. Perché non riscrivere la funzione come 'compare ':: Ord a => [a] -> [a] -> Ordinazione' o giù di lì? –
@Aleksander: Dipende da ciò che l'OP vuole.Dal momento che l'OP ha posto una domanda abbastanza elementare, forse lui/lei vuole una risposta elementare? Non dubito che ci siano modi più veloci e/o più idiomatici per scrivere una funzione simile in Haskell, ma forse è meglio mantenere le cose semplici per aiutare l'OP a imparare. –