La comparaison de chaînes normales ne fonctionne que sur l'ordre lexicographique et non sur la longueur des chaînes.
Vous devriez écrire votre propre fonction de vérifier également la longueur:
smaller :: String -> String -> Bool
smaller s1 s2 | length s1 < length s2 = True
| length s1 > length s2 = False
| otherwise = s1 < s2
Ou un peu plus générale:
compareStrings :: String -> String -> Ordering
compareStrings s1 s2 | length s1 < length s2 = LT
| length s1 > length s2 = GT
| otherwise = compare s1 s2
Exemple:
ghci> compare "ab" "z"
LT
ghci> compareStrings "ab" "z"
GT
Nous étions en train de jouer avec les monoïdes à université la semaine dernière, et nous sommes arrivés avec cette belle solution de rechange Ord
exemple:
instance Ord a => Ord [a] where
compare = comparing length
`mappend` comparing head `mappend` comparing tail
Mais si vous ne comprenez pas tout à fait cela, je vous suggère de tenir à la première définition ;-)
Ceci est évidemment plus rapide que ma version, car il calcule une seule fois la longueur des chaînes. Il peut probablement être rendu encore plus rapide en effectuant une correspondance directe de modèle sur les chaînes d'entrée, fusionnant ainsi cette définition et la définition de la fonction 'length'. –
Haskell est axé sur la généralisation et les bonnes pratiques de codage, et il a un très bon système de type (classe). Pourquoi ne pas réécrire la fonction comme 'compare ':: Ord a => [a] -> [a] -> Ordering ou quoi? –
@Aleksander: Cela dépend de ce que veut le PO.Puisque le PO a posé une question assez élémentaire, peut-être veut-il une réponse élémentaire? Je ne doute pas qu'il existe des manières plus rapides et/ou plus idiomatiques d'écrire une telle fonction dans Haskell, mais peut-être est-il préférable de garder les choses simples pour aider le PO à apprendre. –