Curried Functions
Functions in Haskell are also free to return functions as their results. This brings us to curried functions which take in one argument at a time and return a function that takes in additional arguments. Actually, all functions in Haskell with multiple arguments are applied this way (unless explicitly stated otherwise) – the function is first applied to the first argument and returns another function that is then applied to the second argument and so on. Let's explore this with an example of a multiplication function that takes in three numbers and multiplies them:
ghci> multiply x y z = x * y * z
ghci> :t multiply
multiply :: Num a => a -> a -> a -> a
-- a -> a -> a -> a actually means:
Num a => a -> (a -> (a -> a))
That is, `multiply` takes the argument `x` of type `a` and returns another function that takes in the argument `y` (also of type `a`) and returns another function that takes in argument `z` (also of type `a`) that then returns the final result. To avoid unnecessary parentheses, the function arrow `->` associates to the right by convention, while the function application associates to the left:
multiply x y z
-- is actually:
((multiply x) y) z