Why FP
Elements of Functional languages
Type inference
•

Simplicity

•

Readability

•

Code economy
C/C++ example
int factorial(int n) {
return !n ? 1 : n * factorial(n - 1);
}
Haskell example
factorial :: Integer -> Integer
factorial n
| n < 0 = error «not defined»
| n == 0 = 1
| otherwise = n * fac (n - 1)
Haskell example
factorial n
| n == 0 = 1
| otherwise = n * fac (n - 1)
Haskell example

factorial n = product [1..n]
Higher-order function
(HOF)
Javascript example
_.sortBy([5,4,1,6], function(n){
return Math.sin(n)
})
Closure
Common Lisp example
(define counter-from
(lambda (n)
(lambda ()
(set! n (+ n 1))
n)))
Partial application
Python example
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs),
**newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
Immutable & persistent
data structures
ADT
OOP example

abstract class Shape {
abstract float area();
abstract void draw();
}
class Rectangle extends Shape {
float w, h;
...
float area() { return w * h; }
}
class Circle extends Shape {
float r;
...
float area() { return PI * r * r; }
}
ADT example
data Shape =
Rectangle Float Float
| Circle Float
area :: Shape -> Float
area (Rectangle w h) = w * h
area (Circle r) = pi * r * r
draw :: Shape -> IO ()
...
Compare
Rectangle

Circle

Other

area()

ADT

draw()

other()

OOP
Pattern matching
Haskell example
head (x:_) = x
tail (_:xs)= xs
Chain of responsibility
Abstract example
[recieve,
check,
process,
finish]

Why fp