Redefine dropWhile into multiple argument lists to help type inference

It's a little unfortunate that we need to state that the type of x is
Int. The first argument to dropWhile is a List[Int], so the function in
the second argument must accept an Int. Scala can infer this fact if we
group dropWhile into two argument lists.

The syntax for calling this version of dropWhile looks like
dropWhile(xs)(f). That is, dropWhile(xs) is returning a function, which
we then call with the argument f (in other words, dropWhile is
curried). The main reason for grouping the arguments this way is to
assist with type inference. We can now use dropWhile without
annotations:

val xs: List[Int] = List(1,2,3,4,5)
val ex1 = dropWhile(xs)(x => x < 4)

Note that x is not annotated with its type.
More generally, when a function definition contains multiple argument
groups, type information flows from left to right across these argument
groups.  Here, the first argument group fixes the type parameter A of
dropWhile to Int, so the annotation on x => x < 4 is not required.

We’ll often group and order our function arguments into multiple
argument lists to maximize type inference.