2. What is Functional programming(FP)?
• Programming paradigm(inside Declarative (contrast: Imperative) )
• Use function
• Original is Lambda calculus
• Avoid side effect
• Avoid changing state
• Avoid mutable data
3. Lambda calculus
• def sum (a, b) = a + b
• Lambda calculus version = (a -> (b -> a + b))
• Currying(function return function) example
Sum = (a -> (b -> a + b))
Sum3 = Sum(3) = (3 -> (b -> 3 + b)) = (b -> 3 + b)
Sum34 = Sum(3)(4) = Sum3(4) = (4 -> 3 + 4) = 7
4. OOP vs FP (factorial)
OOP
result: BigInt = 1;
for (int i = 1; i<=n;i++) {
result = result * i;
}
FP
def fac(n): BigInt = {
if(n == 1) return 1;
else return n * fac(n-1);
}
tail call optimize version
def fac(n, result = 1): BigInt = {
if(n == 1) return result;
else return fac(n-1, result * n);
}
5. Popular function in FP
• Map => List(1,2,3).map(a => a+1) = List(2,3,4)
• Reduce => List(1,2,3).reduce(_ + _) = 6
• Filter => List(1,2,3).filter(a => a <= 2) = List(1,2)
• Take => List(1,2,3).take(1) = List(1)
• Drop => List(1,2,3).drop(1) = List(2,3)
• Head => List(1,2,3).head => List(1)
• Tail => List(1,2,3).tail => List(2,3)
6. side effect
What is side effect
• I/O**
• Database connection**
• Http request**
• Random number
(**) next slide
Example
Don’t have side effect
def sum(a, b): Int = return a + b;
Have side effect
sideEffectNum = random();
def sumSideEffect(a, b): Int =
return a + b + sideEffectNum;
Solved
sideEffectNum = random();
def sumSideEffect(a, b, sideEffectNum): Int =
return a + b + sideEffectNum;
7. How to solve “side effect”?
• Functor
• Applicative
• Monad