Pure Functions
Its just a way to write methods.
In Mathematics, functions always produce the same output for a given set of inputs.
In Functional Programming world, a pure function:
- For a given input, will always produce the same output.
 - should not produce any Side-effects
 
Have have look the function add in following example:
Remember: We are just going to understand what a pure function can / can not do. The “logic” and the “effect/output” across all the code snippet will vary
y = 5
 
def add(x):
 y += x 
 
# function calls
add(5); # y == 10
add(5); # y == 15 
# same input, different output
# not allowed in FPThe issue is that the function is dependent on/modifying a state which is outside its own scope.
This is an example of Side-effect
What about the following implementation of add ?
def add (x, y){
 return x + y
}
 
y = 5
# function calls
add(y, 5); # 10
add(y, 5); # 10
# same input, same outputAll good right?
Now let’s do a slight modification
def add ( x, y) {
 return x + y
}
 
y = 5
# function calls
add(y, 5); # 10
 
# 100 lines of code
y = 20 # oh no somebody changed the variable
# 100 lines of code
 
add(y, 5); # 25
# same input, different outputThe issue is that the original variable y is mutable. And it will be hard to see where the y is getting mutated if you have 100s of lines of code in between.
To solve this, make all variables immutable
Every function will always return a new variable or copy of the existing variable.
You can see the issue here, COPIES !!
Consider an example:
def update (arr, index, value): # arr is immutable
 new_arr = arr # need to make a mutable copy of arr
 new_arr[index] = valu
 return new_arrSo just to modify a single value, we need to create a deep copy of the whole input array.
This looks insane, but in reality, Functional Programming languages implement
persistent_data_structures, which can avoid deep copies and perform efficiently.