A reference to logician Haskell Curry, currying is a technique for converting a function that takes multiple arguments into a chain of abstract functions that each take a single argument (see Currying).
Besides its significance for studying functions in the context of theoretical computer science and its relevance to lambda calculus both in the context of mathematics and linguistics, currying has very practical applications in functional programming.
In a way, it’s one possible approach for following the inversion of control design principle and implementing dependency injection within a functional programming context. Of course, these concepts usually apply to object-oriented architectures. However, that doesn’t mean those aren’t useful in terms of functional programming. In a nutshell, currying allows us to define an abstract function, pass that function down the call chain, and only define its dependencies once those become relevant and applicable. Using this technique we can delegate the definition of behaviour that is extraneous to the function we’re implementing to the call site of that function.
Another – slightly more complex – example can be seen in this GitHub Gist, where I delegated the addition of a specific precondition header to an error handling function that retries an original HTTP request with an HTTP header serving as a confirmation message.