# 8.1 Simple function definitions

You can define simple calculations easily. We'll use a classic example:

fun square (x:int) => x * x;

The function `square`

just multiplies its argument `x`

by itself.
We can use it now:

write$ stdout, "Input number: "; fflush stdout; val result = readln$ stdin; val cleaned_result = strip result; val v = int cleaned_result; val v2 = square v; println$ "Square of " + str v + " is " + str v2;

42

Input number: 42 Square of 42 is 1764

Here:

- The
`fun`

binder introduces the function`square`

. -
`square`

accepts a single argument of type`int`

. - The operator
`*`

is used for multiplication. -
`square`

returns the product of its argument with itself. - The type of value returned by
`square`

is deduced by the compiler, that type will be`int`

because multiplying an`int`

by another`int`

yields an`int`

. - The type
`int`

can also be used as a function to convert a`string`

containing only digits to an`int`

. - The function
`str`

can be used to convert an`int`

to a string.

There is a rule for functions:

A function introduced by a`fun`

binder is not allowed to have any side effects.

The compiler does not enforce this rule, but it does take advantage of it when optimising your code.