Haskell CodeEval Beautiful Strings
This looks like nice Haskell to me! I'm not an expert, but I could make a few remarks:


args !! 0 could be simplified to head args. It's just more idiomatic.
maximumBeautyInner could be renamed to maximumStringBeauty'. That's what I see most of the time, anyway, in this pattern (having an outer "starter" function and an inner "real recursive" function).
I would write:

countSort = reverse . sortOn length . group . sort


because it reads nicer, but I'm not sure how expensive the reverse will be afterwards.
maximumBeautyInner can be written much more concisely when using the builtins sum, zipWith and map. When writing recursive functions, try to see if you can use these and maybe fold or another of their family.

  where maximumBeautyInner = sum . zipWith (*) [26, 25..1] . map length


Step by step:


The map length returns only the lengths of the groups (from countSort).
The zipWith combines that list with the list [26, 25..1] to form pairs, and applies * to each pair of values. So the first (highest) length gets multiplied by 26, the next one by 25, etcetera.
sum, finally, sums them all up (you'd probably guessed).


You would only pass the result of the countSort to this function, as it is now [[Char]] -&gt; Int.

By using these list functions, you can reduce the need for your own recursive functions, which increases readability.


All in all, well-factored code, and a good way to solve this problem!

EDIT: instead of using countSort = reverse . sortOn length . group . sort, use countSort = sortOn (negate . length) . group . sort. That removes the need for reverseing the list.