Currying is an operation on functions. A functional programming language lets you specify such operations. Here's how to curry the first and second arguments of any binary function in Scheme:


(define (curry-2-arg-1st f x)
  (lambda (y) (f x y)))
(define (curry-2-arg-2nd f x)
(lambda (y) (f y x)))
In most pure functional languages, functions are always curried. So the type of a k-arg function is "function taking one argument and returning a k-1-arg function". Currying the first and second arguments (of any function of at least that many arguments!) is as simple as saying
let curry_fst f x = f x;;
let curry_snd f x = \y.(f y x)


in a contrived syntax where "\" means lambda, and other things are a bit like ML.