I am having a discussion around Multiple Parameter Lists in the Scala Style Guide I maintain. I\'ve come to realize that there are two ways of currying, and I\'m wo
I think it helps to grasp the differences if I add that with def add(a: Int)(b: Int): Int you pretty much just define a method with two parameters, only those two parameters are grouped into two parameter lists (see the consequences of that in other comments). In fact, that method is just int add(int a, int a) as far as Java (not Scala!) is concerned. When you write add(5)_, that's just a function literal, a shorter form of { b: Int => add(1)(b) }. On the other hand, with add2(a: Int) = { b: Int => a + b } you define a method that has only one parameter, and for Java it will be scala.Function add2(int a). When you write add2(1) in Scala it's just a plain method call (as opposed to a function literal).
Also note that add has (potentially) less overhead than add2 has if you immediately provide all parameters. Like add(5)(6) just translates to add(5, 6) on the JVM level, no Function object is created. On the other hand, add2(5)(6) will first create a Function object that encloses 5, and then call apply(6) on that.