# Tribute to Alonzo C.

In mathematics functions are relations between two sets (denoted as f: X -> Y). Quite often functions take several arguments and give one result (for example add: R x R -> R). Interestingly it is possible to define only functions which take only one argument and still be possible to express any function. The process of transforming a function with arbitrary number of arguments to a function which takes only one argument is called currying.

## Function Currying

``````func add(x : int, y : int) -> int
{
x + y
}
``````

The above code snippet presents function `add` which returns sum of its arguments.

``````func cadd(x : int) -> (int) -> int
{
let func (y : int) -> int
{
x + y
}
}
``````

To curry `add` function we define function `cadd` which takes first addend and returns anonymous function (often called lambda) which takes second addend (cadd: R -> (R -> R)). Then such function can be used to return sum. Curried `add` is presented in Never programming language in the above listing.

``````func main() -> int
{
Lets see how `add` and `cadd` functions are used to add two numbers. As expected `add` takes two arguments. Interesting is usage of `cadd` function which returns anonymous function which is invoked with second argument.