46
Functional Programming Principles & Patterns

Functional Programming Principles & Patterns

Embed Size (px)

Citation preview

Page 1: Functional Programming Principles & Patterns

Functional Programming

Principles & Patterns

Page 2: Functional Programming Principles & Patterns

Agenda● Introduction to Functional Programming● Principles● Concepts● Patterns● Q & A

Code-examples are written in Java and JavaScript

Page 3: Functional Programming Principles & Patterns

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!)○ ...

Page 4: Functional Programming Principles & Patterns

Functional Programming Languages● Common Lisp● Haskell● SML● Clojure● Scala● Erlang● (Java)● (JavaScript)● ...

Page 5: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 6: Functional Programming Principles & Patterns

Declarative vs. Imperative● Defining WHAT to do vs. HOW to do it● Expressive● Improve / Optimize underlying algorithms● Eliminate Side-effects as much as possible

Page 7: Functional Programming Principles & Patterns

Declarative vs. Imperative - Example

Page 8: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 9: Functional Programming Principles & Patterns

Pure Functions● No side-effects● Referential Transparency (caching, ...)● Thread-safe● Compiler-Optimizations● ...

Page 10: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 11: Functional Programming Principles & Patterns

Higher Order Functions● Critical concept in FP● Functions can take functions as arguments● Functions can return functions● Enables functional composition

Page 12: Functional Programming Principles & Patterns

Higher Order Functions - Example #1

Page 13: Functional Programming Principles & Patterns

Higher Order Functions - Example #2

Page 14: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 15: Functional Programming Principles & Patterns

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)

Page 16: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 17: Functional Programming Principles & Patterns

Recursion● Divide and Conquer● Can provide elegant solutions for complex problems● Not as complicated to do, if one knows how ;)

Page 18: Functional Programming Principles & Patterns

Recursion #1

Page 19: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 20: Functional Programming Principles & Patterns

Laziness● Evaluation is deferred to the last possible moment● Avoids needless calculations● Working with infinite data structures● Works very well with declarative programming

Page 21: Functional Programming Principles & Patterns

Laziness Example

Page 22: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 23: Functional Programming Principles & Patterns

map / Filter / Reduce / Zip● Backbone of functional programming

Page 24: Functional Programming Principles & Patterns

map

Page 25: Functional Programming Principles & Patterns

Filter

Page 26: Functional Programming Principles & Patterns

Reduce

Page 27: Functional Programming Principles & Patterns

Zip

Page 28: Functional Programming Principles & Patterns

Concepts● Declarative vs. Imperative● Pure Functions● Higher Order Functions (+Lambdas)● Immutability● Recursion● Laziness● map/filter/reduce/zip/flatMap● Currying

Page 29: Functional Programming Principles & Patterns

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

Page 30: Functional Programming Principles & Patterns

Currying - Example #1

Page 31: Functional Programming Principles & Patterns

Currying - Example #2

Page 32: Functional Programming Principles & Patterns

Currying - Example #3

Page 33: Functional Programming Principles & Patterns

Patterns● GOF-Patterns in Functional Style● Memoization● Advanced Currying● Immutability in practice● Maybe / Optional● Outlook: Advanced Topics

Page 34: Functional Programming Principles & Patterns

GOF Patterns vs. Functional Programming

Page 35: Functional Programming Principles & Patterns

GOF - Decorator (wrapper function)

Page 36: Functional Programming Principles & Patterns

GOF - Strategy (higher order functions)

Page 37: Functional Programming Principles & Patterns

Memoization (Caching Technique - Java)

Page 38: Functional Programming Principles & Patterns

Memoization (Caching Technique - JS)

Page 39: Functional Programming Principles & Patterns

Immutability in practice● Data Structures don’t necessarily need to be persistent

in nature● Use map / filter / reduce● Examples in JS:

Page 40: Functional Programming Principles & Patterns

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

Page 41: Functional Programming Principles & Patterns

Maybe / Optional

Page 42: Functional Programming Principles & Patterns

Advanced Topics● Monoids / Functors / Applicatives● Algebraic Structures in general● Monads● Transducers● ...

Page 43: Functional Programming Principles & Patterns

Q & A

Page 44: Functional Programming Principles & Patterns
Page 45: Functional Programming Principles & Patterns

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/

Page 46: Functional Programming Principles & Patterns

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