Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Functional programming

Functional programming

Functional programming

Volodymyr Prokopyuk

June 29, 2015
Tweet

More Decks by Volodymyr Prokopyuk

Other Decks in Programming

Transcript

  1. ANTONY HOARE There are two ways of constructing a software

    design: one way is to make it so simple that there are obviously no deficiencies; the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult
  2. HASKELL GENERAL PURPOSE PURELY FUNCTIONAL LAZY PROGRAMMING LANGUAGE OPEN STANDARD

    FOR LAZY FUNCTIONAL LANGUAGES BASE FOR FUTURE RESEARCH IN LAZY FUNCTIONAL LANGUAGE DESIGN
  3. PURELY FUNCTIONAL LANGUAGE FUNCTIONS WITHOUT SIDE EFFECTS REFERENTIAL TRANSPARENCY NO

    EXPLICIT STATE MANAGEMENT BUT EXPRESSIONS EVALUATION DESCRIBE WHAT THE MODEL IS — NOT HOW TO COMPUTE THE RESULT
  4. FIRST-CLASS FUNCTIONS HIGHER-ORDER FUNCTIONS TREAT FUNCTIONS AS DATA inc ::

    (Num a) => a -> a inc = (+ 1) items = [ 1, 2, 3, 4 ] map inc items // [ 2, 3, 4, 5 ] FUNCTION COMPOSITION LOOSE COUPLING, HIGH COHESION double :: (Num a) => a -> a double = (* 2) incDouble :: (Num a) => a -> a incDouble = double . inc map incDouble items // [ 4, 6, 8, 10 ]
  5. FUNCTION CURRYING FUNCTION CONFIGURATION INCREASE FUNCTION COHESION WHILE COMPOSING FUNCTIONS

    add :: (Num a) => a -> a -> a add x y = x + y PARTIAL APPLICATION IN HASKELL ALL FUNCTIONS TAKE ONLY ONE ARGUMENT AND RETURN A VALUE OR A NEW FUNCTION OF ONE ARGUMENT add1 :: (Num a) => a -> a add1 = add 1
  6. ALGEBRAIC DATA TYPES TWO OPERATIONS TO CONSTRUCT TYPES: ADDITION AND

    MULTIPLICATION data Bool = False | True data Point = Point Float Float data Shape = Circle Point Point | Rectangle Point Point EVERY ALGEBRAIC DATA TYPE IS A TREE WITH NODES AS COMPOSITE DATA TYPE AND LEAFS AS PRIMITIVE DATA TYPE
  7. PATTERN MATCHING DECONSTRUCT AND COMPOSE TREES factorial :: Int ->

    Int factorial 0 = 1 factorial n = n * factorial (n - 1) head :: [ a ] -> a head [ ] = error "head: empty list" head (x:_) = x FUNCTIONS BUILD NEW TREES FROM INPUT TREES USING DECONSTRUCTION (PATTERN MATCHING) AND COMPOSITION (EXPRESSIONS) function deconstruction = composition function pattern matching = expressions
  8. RECURSION LENGTH CONCATENATION length :: [ a ] -> Int

    length [ ] = 0 length (x : xs) = 1 + length xs (++) :: [ a ] -> [ a ] -> [ a ] [ ] ++ ys = ys (x : xs) ++ ys = x : xs ++ ys
  9. QUICKSORT HASKELL qsort :: (Ord a) => [ a ]

    -> [ a ] qsort [ ] = [ ] qsort (x : xs) = (qsort lesser) ++ [ x ] ++ (qsort greater) where lesser = filter (< x) xs greater = filter (>= x) xs C void qsort(int a[], int lo, int hi) { int h, l, p, t; if (lo < hi) { l = lo; h = hi; p = a[hi]; do { while ((l < h) && (a[l] <= p)) { l = l + 1; } while ((h > l) && (a[h] >= p)) { h = h - 1; } if (l < h) { t = a[l]; a[l] = a[h]; a[h] = t; } } while (l < h); a[hi] = a[l]; a[l] = p; qsort(a, lo, l - 1); qsort(a, l + 1, hi); } }
  10. FUNCTIONAL TOOLBOX MAP map :: (a -> b) -> [

    a ] -> [ b ] map _ [ ] = [ ] map f (x : xs) = f x : map f xs FILTER filter :: (a -> Bool) -> [ a ] -> [ a ] filter _ [ ] = [ ] filter p (x : xs) | p x = x : filter p xs | otherwise = filter p xs REDUCE reduce :: (a -> b -> a) -> a -> [ b ] -> a reduce _ z [ ] = z reduce f z (x : xs) = reduce f (f z x) xs
  11. FUNCTIONAL EXAMPLES SUM AND PRODUCT sum = reduce (+) 0

    product = reduce (*) 1 MAP AS REDUCE map :: (a -> b) -> [ a ] -> [ b ] map f = reduce ((:) . f) [ ] FILTER AS REDUCE filter :: (a -> Bool) -> [ a ] -> [ a ] filter p = reduce (\ x -> if p x then (x :) else id) [ ]
  12. PARAMETRIC POLYMORPHISM TYPE PARAMETER data Maybe a = Nothing |

    Just a TYPE VARIABLE AND POLYMORPHIC FUNCTION head :: [ a ] -> Maybe a head [ ] = Nothing head (x:_) = Just x TYPE CLASS class Eq a where (==) :: a -> a -> Bool INSTANCE OF TYPE CLASS instance Eq Integer where x == y = x ` ` y eq
  13. TYPE INFERENCE AUTOMATIC DEDUCTION OF THE DATA TYPE OF AN

    EXPRESSION NO NEED TO EXPLICITLY ANNOTATE DATA VALUES WITH TYPES
  14. DECLARATIVE STYLE OVER IMPERATIVE STYLE COMPOSITION OVER INHERITANCE EXPRESSION OVER

    STATEMENT EVENT-BASED OVER MULTITHREADED CONTEXT DECLARATIVE EXPRESSION LOCAL VARIABLES WHERE LET ... IN ... CONDITIONALS GUARDS IF ... THEN ... ELSE ... DECONSTRUCTION PATTERN MATCHING CASE ... OF ... FUNCTION DEFINITION EQUATIONS LAMBDA FUNCTIONS
  15. NEW PROGRAMMING LANGUAGES CONCEPT PARADIGM FUNCTIONAL FUNCTIONAL FUNCTIONAL FUNCTIONAL TYPE

    SYSTEM STATIC DYNAMIC STATIC STATIC FIRST-CLASS FUNCTIONS YES YES YES YES FUNCTION CURRYING YES YES YES NO ALGEBRAIC DATA TYPES YES NO YES YES PATTERN MATCHING YES NO YES YES PARAM. POLYMORPHISM YES NO YES YES TYPE INFERENCE YES NO YES YES HASKELL JAVASCRIPT SCALA RUST