The arity of a function is the number of arguments the function
takes. Functions of arity 0, 1, 2 and 3 are often called nullary, unary,
binary and ternary functions, respectively. For example, the following
function sqrsum1 is a binary function such that its two
arguments are of the type int:
We can define a unary function
sqrsum2 as follows:
The keyword
typedef introduces a binding between the name
int2 and the tuple type
(int, int). In other
words,
int2 is treated as an abbreviation or alias for
(int, int). The function
sqrsum2 is unary as it
takes only one argument, which is a tuple of the type
int2.
When applying
sqrsum2 to a tuple consisting of
1
and
~1, we need to write
sqrsum2 @(1, ~1). If we
simply write
sqrsum2 (1, ~1), then the typechecker is to
report an error of arity mismatch as it assumes that
sqrsum2
is applied to two arguments (instead of one that is a tuple).
Many functional languages (e.g., Haskell and ML) only allow unary
functions. A function of multiple arguments is encoded in these languages
as a unary function taking a tuple as its only argument or it is curried
into a function that takes these arguments sequentially. ATS, however,
provides direct support for functions of multiple arguments. There is even
some limited support in ATS for variadic functions, that is, functions of
indefinite number of arguments (e.g., the famous printf
function in C). This is a topic I will cover elsewhere.