Обычное сравнение строк работает только в лексикографическом порядке, а не в длине строк.
Так что вам нужно написать свою собственную функцию, чтобы также проверить длину:
smaller :: String -> String -> Bool
smaller s1 s2 | length s1 < length s2 = True
| length s1 > length s2 = False
| otherwise = s1 < s2
Или немного более общий:
compareStrings :: String -> String -> Ordering
compareStrings s1 s2 | length s1 < length s2 = LT
| length s1 > length s2 = GT
| otherwise = compare s1 s2
Пример:
ghci> compare "ab" "z"
LT
ghci> compareStrings "ab" "z"
GT
На прошлой неделе мы играли с моноидами в университете, и мы придумали этот прекрасный альтернативный экземпляр Ord
:
instance Ord a => Ord [a] where
compare = comparing length
`mappend` comparing head `mappend` comparing tail
Но если вы не совсем понимаете это, я предлагаю вам придерживаться первого определения; -)