Introduction to Functional Programming

Preview:

Citation preview

Functional PROGRAMMING

Zhongke ChenPayPal Risk

Monday, June 24, 13

My name’s Zhongke Chen(陈忠克)

Python, C/C++ Coder

I worked for Wenzhou University, Virtuos Games, Ericsson

I majored in EE (Multimedia Analysis)

Twitter, Sina Weibo: @ch3n2k

Monday, June 24, 13

Why Learn FP?

Monday, June 24, 13

FP is no longer exclusive to Lisp, Haskell, Erlang, ...

Monday, June 24, 13

FP is no longer exclusive to Lisp, Haskell, Erlang, ...

Monday, June 24, 13

)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))) ))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))) ))))))))))))))))))))))))))) ))))))))))))))))))))))))) )))))))))))))))))))))) )))))))))))))))))))) )))))))))))))))) ))))))))))))))) )))))))))))

Monday, June 24, 13

How to learn Lisp - a new language?

Monday, June 24, 13

Primitive ElementsMeans of CombinationMeans of Abstraction

Monday, June 24, 13

• Primitives

+ * 4 3.14

• Combinations

(+ 4 3.14 2.6)

(* (+ 4 4) (+ 5 5))

(IF (5 > 4) 5 4)

• Abstractions

(DEFINE A (* 5 5))

(DEFINE SQUARE (LAMBDA (x) (* x x))) <- Lambda

(DEFINE (SQAURE x) (* x x)) <- Syntactic Sugar

Monday, June 24, 13

Exercise:

1. average (x, y) = (x+y)/2

2. mean-square(x,y) = (x*x + y*y)/2

3. abs(x) = |x|

Monday, June 24, 13

(DEFINE (AVERAGE x y)

(/ (+ x y) 2))

(DEFINE (MEAN-SQUARE x y)

(AVERAGE (SQUARE x)

(SQUARE y)))

(DEFINE (ABS x)

(IF (< x 0)

(- x)

x))

Monday, June 24, 13

Evaluation Order of MEAN-SQUARE(4, 6)?

MEAN-SUQARE(4, 6)

-> (AVERAGE (SQUARE 4) (SQUARE 6))

-> (AVERAGE 16 (SQUARE 6))

-> (AVERAGE 16 36)

-> 26

Strict Order

Monday, June 24, 13

MEAN-SUQARE(4, 6)

-> (AVERAGE (SQUARE 4) (SQUARE 6))

-> (/ (+ (SQUARE 4) (SQUARE 6)) 2)

-> (/ (+ (SQUARE 4) (SQUARE 6)) 2)

-> (/ (+ (* 4 4) (SQUARE 6)) 2)

-> (/ (+ 16 (SQUARE 6)) 2)

...

Non-Strict Order (Lazy Evaluation)Monday, June 24, 13

fibs = 0:1:zipWith (+) fibs (tail fibs)

Infinite List (needs Lazy Evaluation)

Monday, June 24, 13

More example:

fact(n) = n!

Monday, June 24, 13

(DEFINE (FACT n)

(IF (= n 0)

1

(* n (FACT (- n 1))))) <- Recursion

Monday, June 24, 13

(FACT 3)

->(IF (= 3 0) 1 (* 3 (FACT (- 3 1))))

->(* 3 (FACT (- 3 1)))

->(* 3 (FACT 2))

->(* 3 (IF (= 2 0) 1 (* 2 (FACT (- 2 1)))))

->(* 3 (* 2 (FACT 1)))

->(* 3 (* 2 (* 1 (FACT 0))))

->(* 3 (* 2 (* 1 1)))

->(* 3 (* 2 1))

->(* 3 2)

->6

Monday, June 24, 13

(DEFINE (FACT-IMPL n r)

(IF (= n 0)

r

(FACT-IMPL (- n 1) (* n r))))

(DEFINE (FACT n)

(FACT-IMPL n 1))

Tail Call Optimization

Monday, June 24, 13

(FACT 3)

->(FACT-IMPL 3 1)

->(IF (= 3 0) 1 (FACT-IMPL (- 3 1) (* 3 1)))

->(FACT-IMPL 2 3)

->(IF (= 2 0) 3 (FACT-IMPL (- 2 1) (* 2 3)))

->(FACT-IMPL 1 6)

->(IF (= 1 0) 6 (FACT-IMPL (- 1 1) (* 1 6)))

->(FACT-IMPL 0 6)

->(IF (= 0 0) 6 (FACT-IMPL (- 0 1) (* 0 6)))

->6

Monday, June 24, 13

Final Example

sqrt(x)

Monday, June 24, 13

Algorithm

make a guess G

improve the guess by averaging G and x/G

keep improving the guess until it’s good enough

use 1 as an initial guess

Monday, June 24, 13

(DEFINE (TRY guess x)

(IF (GOOD-ENOUGH? guess x)

guess

(TRY (IMPROVE guess x) x)))

(DEFINE (SQRT x) (TRY 1 x))

(DEFINE (IMPROVE guess x)

(AVERAGE guess (/ x guess)))

(DEFINE (GOOD-ENOUGH? guess x)

(< (ABS (- (SQUARE guess) x))

0.00001))

Monday, June 24, 13

(DEFINE (SQRT x)

(DEFINE (IMPROVE guess) <- Closure

(AVERAGE guess (/ x guess)))

(DEFINE (GOOD-ENOUGH? guess) <- Closure

(< (ABS (- (SQUARE guess) x))

0.00001))

(DEFINE (TRY guess)

(IF (GOOD-ENOUGH? guess)

guess

(TRY (IMPROVE guess))))

(TRY 1))

Monday, June 24, 13

Then how to calculate Cube root etc?

We need higher level of abstraction!

Monday, June 24, 13

Fixed-Point of function f:

is the x that f(x) = x

Monday, June 24, 13

Given fixed-point, how to calculate sqrt(x)?

f(y) = (y+x/y)/2

Monday, June 24, 13

(DEFINE (SQRT x)

(FIXED-POINT

(LAMBDA (y)

(AVERAGE (/ x y) y))

1))

Monday, June 24, 13

(DEFINE (FIXED-POINT f guess)

(DEFINE (CLOSE-ENOUGH? u v)

(< (ABS (- u v)) 0.0001))

(DEFINE (ITER OLD NEW)

(IF (CLOSE-ENOUGH? OLD NEW)

NEW

(ITER NEW (f NEW))))

(ITER guess (f guess)))

Higher Order Function

Monday, June 24, 13

Newton’s method converges more rapidly

find a y that f(y) = 0

start a guess y0,

yn+1 = yn - f(yn)/f’(yn)

Monday, June 24, 13

(DEFINE (NEWTON f guess)

(DEFINE DF (DERIV f))

(FIXED-POINT

(LAMBDA (y) (- y (/ (f y)(DF y))))

guess))

(DEFINE DERIV

(LAMBDA (f)

(LAMBDA (x)

(/ (- (f (+ x dx))(f x)) dx))))

(DEFINE dx 0.00001)

Monday, June 24, 13

(DEFINE (SQRT x)

(NEWTON

(lambda (y) (- (square y) x))

1.0))

Monday, June 24, 13

Covered:

Lambda

Tail Call Optimization

Lazy Evaluation

Closure

Higher Order Function

Not Covered:

Currying

Continuation

Pattern Matching

Monads

...

Monday, June 24, 13

Thanks!

Monday, June 24, 13