I'm not sure that I really understand your question - what would you like to know, besides the actual implementation? As described, this should be pretty trivial:
def curry[A,B,C](f:(A,B) => C): A => B => C = a => b => f(a,b)
What does a => b => f(a,b) mean is a function of one argument a whose return value is b => f(a,b) , which again is a function of one argument b , the return value of which you get, you execute f(a,b) (whose type is C ) "
a => b => f(a, b) can be written in a little more detail, if that helps?
{ (a: A) => {
and
def uncurry[A,B,C](f:A => B => C): (A,B) => C = (a, b) => f(a)(b)
Where (a, b) => f(a)(b) means: "A function of two arguments (a, b) , the return value of which is obtained when you first apply a to HoF f , which returns a function, which in turn consumes b to return a C ".
Does it help?
source share