Functional Programming Principles & Patterns
Agenda ● Introduction to Functional Programming ● Principles ● Concepts ● Patterns ● Q & A Code-examples are written in Java and JavaScript
Introduction to Functional Programming ● Benefits ○ Declarative (what vs. how) ○ Scalability / Concurrency ○ Testability ○ Composability & Modularity ○ Ability to reason about programs / Simplicity ○ ... ○ In our case: Broadening our Horizon ● Use-cases ○ Mathematical programming ○ Distributed Systems ○ High Concurrency ○ GUI programming (new!) ○ ...
Functional Programming Languages ● Common Lisp ● Haskell ● SML ● Clojure ● Scala ● Erlang ● (Java) ● (JavaScript) ● ...
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Declarative vs. Imperative ● Defining WHAT to do vs. HOW to do it ● Expressive ● Improve / Optimize underlying algorithms ● Eliminate Side-effects as much as possible
Declarative vs. Imperative - Example
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Pure Functions ● No side-effects ● Referential Transparency (caching, ...) ● Thread-safe ● Compiler-Optimizations ● ...
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Higher Order Functions ● Critical concept in FP ● Functions can take functions as arguments ● Functions can return functions ● Enables functional composition
Higher Order Functions - Example #1
Higher Order Functions - Example #2
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Immutability ● Persistent Data Structures ● Every time a data structure would be mutated, a new one is returned instead ● Simplifies state management and mutation tracking ● Enables optimizations ● Works well with pure functions ● Memory overhead is mitigated by sharing (Tries)
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Recursion ● Divide and Conquer ● Can provide elegant solutions for complex problems ● Not as complicated to do, if one knows how ;)
Recursion #1
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Laziness ● Evaluation is deferred to the last possible moment ● Avoids needless calculations ● Working with infinite data structures ● Works very well with declarative programming
Laziness Example
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
map / Filter / Reduce / Zip ● Backbone of functional programming
map
Filter
Reduce
Zip
Concepts ● Declarative vs. Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
Currying ● Concept by Haskell Curry ● Translating a function that takes multiple arguments into a sequence of functions which all take 1 argument ● e.g.: add(a, b) AND add(a)(b) ● Improves reusability and composition ● In some languages (Haskell, F#) functions are curried by default
Currying - Example #1
Currying - Example #2
Currying - Example #3
Patterns ● GOF-Patterns in Functional Style ● Memoization ● Advanced Currying ● Immutability in practice ● Maybe / Optional ● Outlook: Advanced Topics
GOF Patterns vs. Functional Programming
GOF - Decorator (wrapper function)
GOF - Strategy (higher order functions)
Memoization (Caching Technique - Java)
Memoization (Caching Technique - JS)
Immutability in practice ● Data Structures don’t necessarily need to be persistent in nature ● Use map / filter / reduce ● Examples in JS:
Maybe / Optional ● Pattern for handling absent (e.g.: Null) values ● Avoid annoying if (x==null) checks ● Great for declarative API’s ● Your business logic doesn’t need to deal with null values, it can just use Maybe()’s ○ At the end, when the actual value is needed, the Maybe can be evaluated and the null can be handled
Maybe / Optional
Advanced Topics ● Monoids / Functors / Applicatives ● Algebraic Structures in general ● Monads ● Transducers ● ...
Q & A
Resources #1 ● https://vimeo.com/113588389 ● http://looprecur.com/blog/ ● https://www.youtube.com/playlist?list=PLK_hdtAJ4KqX0JOs_KMAmUNTNMRYhWEaC ● http://www.infoq.com/presentations/Simple-Made-Easy ● http://www.infoq.com/presentations/Clojure-Design-Patterns ● https://www.manning.com/books/functional-programming-in-java ● https://dzone.com/articles/functional-programming-java-8 ● http://www.vasinov.com/blog/16-months-of-functional-programming/ ● https://www.reddit.com/r/functionalprogramming/ ● https://github.com/jhusain/learnrxjava/ ● http://reactivex.io/learnrx/ ● http://blog.jhades.org/java-8-how-to-use-optional/
Resources #2 ● http://javascriptair.com/episodes/2015-12-30/ ● http://www.amazon.de/Purely-Functional-Data-Structures-Okasaki/dp/0521663504/ref=sr_1_1?ie=UTF8&qid=1452875910&sr=8-1&k eywords=functional+data+structures ● http://www.amazon.de/Functional-Thinking-Paradigm-Over-Syntax/dp/1449365515/ref=sr_1_1?ie=UTF8&qid=1452875871&sr=8-1&k eywords=functional+thinking ● http://www.amazon.de/Becoming-Functional-Joshua-Backfield/dp/1449368174/ref=sr_1_1?ie=UTF8&qid=1452875879&sr=8-1&keyw ords=becoming+functional ● http://www.amazon.de/Functional-JavaScript-Introducing-Programming-Underscore-js/dp/1449360726/ref=sr_1_1?ie=UTF8&qid=145 2875887&sr=8-1&keywords=functional+javascript ● https://github.com/MostlyAdequate/mostly-adequate-guide

Functional Programming Principles & Patterns

  • 1.
  • 2.
    Agenda ● Introduction toFunctional Programming ● Principles ● Concepts ● Patterns ● Q & A Code-examples are written in Java and JavaScript
  • 3.
    Introduction to FunctionalProgramming ● Benefits ○ Declarative (what vs. how) ○ Scalability / Concurrency ○ Testability ○ Composability & Modularity ○ Ability to reason about programs / Simplicity ○ ... ○ In our case: Broadening our Horizon ● Use-cases ○ Mathematical programming ○ Distributed Systems ○ High Concurrency ○ GUI programming (new!) ○ ...
  • 4.
    Functional Programming Languages ●Common Lisp ● Haskell ● SML ● Clojure ● Scala ● Erlang ● (Java) ● (JavaScript) ● ...
  • 5.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 6.
    Declarative vs. Imperative ●Defining WHAT to do vs. HOW to do it ● Expressive ● Improve / Optimize underlying algorithms ● Eliminate Side-effects as much as possible
  • 7.
  • 8.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 9.
    Pure Functions ● Noside-effects ● Referential Transparency (caching, ...) ● Thread-safe ● Compiler-Optimizations ● ...
  • 10.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 11.
    Higher Order Functions ●Critical concept in FP ● Functions can take functions as arguments ● Functions can return functions ● Enables functional composition
  • 12.
  • 13.
  • 14.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 15.
    Immutability ● Persistent DataStructures ● Every time a data structure would be mutated, a new one is returned instead ● Simplifies state management and mutation tracking ● Enables optimizations ● Works well with pure functions ● Memory overhead is mitigated by sharing (Tries)
  • 16.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 17.
    Recursion ● Divide andConquer ● Can provide elegant solutions for complex problems ● Not as complicated to do, if one knows how ;)
  • 18.
  • 19.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 20.
    Laziness ● Evaluation isdeferred to the last possible moment ● Avoids needless calculations ● Working with infinite data structures ● Works very well with declarative programming
  • 21.
  • 22.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 23.
    map / Filter/ Reduce / Zip ● Backbone of functional programming
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
    Concepts ● Declarative vs.Imperative ● Pure Functions ● Higher Order Functions (+Lambdas) ● Immutability ● Recursion ● Laziness ● map/filter/reduce/zip/flatMap ● Currying
  • 29.
    Currying ● Concept byHaskell Curry ● Translating a function that takes multiple arguments into a sequence of functions which all take 1 argument ● e.g.: add(a, b) AND add(a)(b) ● Improves reusability and composition ● In some languages (Haskell, F#) functions are curried by default
  • 30.
  • 31.
  • 32.
  • 33.
    Patterns ● GOF-Patterns inFunctional Style ● Memoization ● Advanced Currying ● Immutability in practice ● Maybe / Optional ● Outlook: Advanced Topics
  • 34.
    GOF Patterns vs.Functional Programming
  • 35.
    GOF - Decorator(wrapper function)
  • 36.
    GOF - Strategy(higher order functions)
  • 37.
  • 38.
  • 39.
    Immutability in practice ●Data Structures don’t necessarily need to be persistent in nature ● Use map / filter / reduce ● Examples in JS:
  • 40.
    Maybe / Optional ●Pattern for handling absent (e.g.: Null) values ● Avoid annoying if (x==null) checks ● Great for declarative API’s ● Your business logic doesn’t need to deal with null values, it can just use Maybe()’s ○ At the end, when the actual value is needed, the Maybe can be evaluated and the null can be handled
  • 41.
  • 42.
    Advanced Topics ● Monoids/ Functors / Applicatives ● Algebraic Structures in general ● Monads ● Transducers ● ...
  • 43.
  • 45.
    Resources #1 ● https://vimeo.com/113588389 ●http://looprecur.com/blog/ ● https://www.youtube.com/playlist?list=PLK_hdtAJ4KqX0JOs_KMAmUNTNMRYhWEaC ● http://www.infoq.com/presentations/Simple-Made-Easy ● http://www.infoq.com/presentations/Clojure-Design-Patterns ● https://www.manning.com/books/functional-programming-in-java ● https://dzone.com/articles/functional-programming-java-8 ● http://www.vasinov.com/blog/16-months-of-functional-programming/ ● https://www.reddit.com/r/functionalprogramming/ ● https://github.com/jhusain/learnrxjava/ ● http://reactivex.io/learnrx/ ● http://blog.jhades.org/java-8-how-to-use-optional/
  • 46.
    Resources #2 ● http://javascriptair.com/episodes/2015-12-30/ ●http://www.amazon.de/Purely-Functional-Data-Structures-Okasaki/dp/0521663504/ref=sr_1_1?ie=UTF8&qid=1452875910&sr=8-1&k eywords=functional+data+structures ● http://www.amazon.de/Functional-Thinking-Paradigm-Over-Syntax/dp/1449365515/ref=sr_1_1?ie=UTF8&qid=1452875871&sr=8-1&k eywords=functional+thinking ● http://www.amazon.de/Becoming-Functional-Joshua-Backfield/dp/1449368174/ref=sr_1_1?ie=UTF8&qid=1452875879&sr=8-1&keyw ords=becoming+functional ● http://www.amazon.de/Functional-JavaScript-Introducing-Programming-Underscore-js/dp/1449360726/ref=sr_1_1?ie=UTF8&qid=145 2875887&sr=8-1&keywords=functional+javascript ● https://github.com/MostlyAdequate/mostly-adequate-guide