IMO currying is a bit advance idea for non-functional programmers.
If I were to explain functional programming in 5 min, I would start from Functions and Values.<p>In FP, there is no difference between a Function and a Value. A function can be defined without a name. You can say every thing is a function & a function takes an input and after performing its magic (calculations), it must return you an output. All values are also functions. So technically there is no difference between x = 2 and x = function(){....}.<p>Now when you realize that all values are also functions or all functions are also values, you can pass functions inside other functions.
Typically in imperative programming your functions only accepts values (like integers, strings etc.) and returns you values. But in FP you can pass functions inside other functions and you can return functions from functions.<p>Lets define a function doSomething(input){ return input } . Now you can call it by passing x where x could be a value or a function.<p>y = doSomething(x)<p>Now if x = function(){ ..} or x = 2, it really doesn't matter for doSomething because doSomething crunches an input and returns it.<p>By learning this technique, you can do lot of "interesting things". And Currying is one of those "interesting things". Every thing in FP really boils down to functions/values. 5 mins are over now.