import List rank :: Integer -> String rank x | x `mod` 10 == 1 = s ++ "st" | x `mod` 10 == 2 = s ++ "nd" | x `mod` 10 == 3 = s ++ "rd" | otherwise = s ++ "th" where s = show x
ranks :: [String] ranks = map rank [1..]
sort_group :: Ord a => [a] -> [[a]] sort_group l = group $ reverse $ sort l
main :: Ord a => [a] -> [(String,[a])] main lst = zip ranks (sort_group lst)