a technique that applies a function to its arguments one at a time, with each application returning a new function that accepts the next argument.