I have understood the concept of "currying" for quite some time now but it wasn't until last night that I really understood how useful it (currying) can be when you want to use a standard library function but pass it something slightly different... I was playing with reading a file using the "withFile" function, withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO r Thing is, the function I wanted to write, as part of its duties, needed to print the filename to the console output before doing its thing... I knew that it could be done and for once I was going to think it through and make it happen! My function had the same type, (Handle -> IO r) , but now I wanted to add in the String that would be the filename and the penny dropped... by using partial application I could "part-bake" a call to my function and leave it in such a state that it would "fit" the required type... read on... got: Handle -> IO r