The more lovely way with this sort of example is not with a ton of application ($)s, but with the composition operator (.) and one last use of the application operator ($) only, isn't it?

Erik hasn't explained map and \x -> ... x ... , yet but anyway, in your example

print (take 10 (sort (map (\x -> x + 17) (filter isPrime xs)))))

what am I doing to the list called xs ? I'm applying this composite function:

print . take 10 . sort . map (\x -> x + 17) . filter isPrime

Whatever I'm starting with, first I filter out just the primes, then I replace each of the remaining numbers with itself + 17; then I omit all but the first 10 things on my list; then print.   

So, to apply this composite function a list, say the first hundred numbers [1..100], you could write:

print . take 10 . sort . map (\x -> x + 17) . filter isPrime $  [1..100] 

Of course, since in the end you're going to print the first 10, following what Erik said about laziness and  take you'd get the same result if you applied it to the infinite list of all numbers:

print . take 10 . sort . map (\x -> x + 17) . filter isPrime $  [1..]