Functional Programming
Veerapat boonvanich 6014550038
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
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
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);
}
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)
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;
How to solve “side effect”?
• Functor
• Applicative
• Monad
Functor
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
Applicative
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
Monad
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
FP Language
Pure
• ML
• Haskell
Impure
• Scala(my work)
• Clojure
• Lisp
• F#
Who use FP?
• Twitter Finagle (scala)
• Apache Spark, Flink (scala)
• Facebook anti spam (haskell)
• Datomic Immutable database (clojure)
Interested in
• Category theory (functor, applicative, monad)
• Lambda calculus <- the most interested
Q & A

Seminar fp