The normal string compare only works on lexicographical ordering, not the length of strings.
So you'd have to write your own function to also check for the length:
smaller :: String -> String -> Bool
smaller s1 s2 | length s1 < length s2 = True
| length s1 > length s2 = False
| otherwise = s1 < s2
Or a bit more general:
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"
ghci> compareStrings "ab" "z"
We were toying around with Monoids at university last week, and we came up with this lovely alternative
instance Ord a => Ord [a] where
compare = comparing length
`mappend` comparing head `mappend` comparing tail
But if you don't quite understand this, I suggest you stick with the first definition ;-)