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