Ensuring referential transparency
We say that an expression is referentially transparent when it can be replaced by its value without changing the program's behavior, in any context. When an expression is a function call, it means that we can always substitute this function call with the return value of the function. A function that guarantees this in any context is called a pure function.
A pure function is like a mathematical function—the return value depends only on the arguments passed to the function. You do not have to consider anything else about the context in which it is called.
Defining pure functions
In the following code, the pureSquare
function is pure:
def pureSquare(x: Int): Int = x * x val pureExpr = pureSquare(4) + pureSquare(3) // pureExpr: Int = 25 val pureExpr2 = 16 + 9 // pureExpr2: Int = 25
The functions called pureSquare(4)
and pureSquare(3)
are referentially transparent—when we replace them with the return value of the function, the program's behavior does not change...