I have noticed a function defined as such:
f[x_][y_] := expr;
How is the argument y in 2nd pair of brackets being used? What is the difference from defining a function this way:
f[x_, y_] := expr;
It allows partial function application. Observe how function test1 defined this way can be called with the first argument, resulting in the return of another function of the remaining argument. Function test2 does not, and simply returns unevaluated since no match to its pattern occurs.