Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Why Functional Programming Matters
Search
αλεx π
January 10, 2014
0
250
Why Functional Programming Matters
Ramblings on the subject of "why FP matters"
αλεx π
January 10, 2014
Tweet
Share
More Decks by αλεx π
See All by αλεx π
Scalable Time Series With Cassandra
ifesdjeen
1
350
Bayesian Inference is known to make machines biased
ifesdjeen
2
360
Cassandra for Data Analytics Backends
ifesdjeen
7
410
Stream Processing and Functional Programming
ifesdjeen
1
720
PolyConf 2015 - Rocking the Time Series boat with C, Haskell and ClojureScript
ifesdjeen
0
440
Clojure - A Sweetspot for Analytics
ifesdjeen
8
2k
Going Off Heap
ifesdjeen
3
1.9k
Always be learning
ifesdjeen
1
140
Learn Yourself Emacs For Great Good workshop slides
ifesdjeen
3
320
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Adopting Sorbet at Scale
ufuk
73
9.1k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Why Our Code Smells
bkeepers
PRO
334
57k
Building Your Own Lightsaber
phodgson
103
6.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
How to Ace a Technical Interview
jacobian
276
23k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
120
Fireside Chat
paigeccino
34
3k
Transcript
Why FP Matters and everyone should learn more of it
None
Major Concepts
Expressions, not assignments FP encourages thinking in results of evaluation,
rather than assigning results to re-assignable variables
Example Recursive computation
(def map! (fn [f coll]! (if (empty? coll) (quote ())!
(cons (f (first coll))! (map f (next coll))))))!
Outcome Easier composition Less errors (no way to modify result
in-between calls)
How to do, not what to do FP discourages operational
reasoning, promotes algorithmical reasoning
Example Evaluation
In Java You write a sequences of steps requiring for
solving the problem
In Haskell You write resolution formulas
In Haskell You write resolution formulas
eval closure sym@(LispSymbol _) eval :: [LispEnvironment] -> LispExpression ->
State LispEnvironment LispExpression eval closure (LispList[(ReservedKeyword FnKeyword), LispVector bindings, form])
Outcome Obvious problem description, based on signatures Matching logic doesn’t
involve if/else statements Logic is inherently recursive
Function composition FP encourages function, rather than object composition
Example Routing: URL parsing + handler logic
(compojure/defroutes main-routes! (GET root "/" request (index request))! (GET search
"/search" request (search request)))
Outcome Both handlers and parsing logic is reusable Testing handlers
doesn’t involve any additional object composition
Primitives FP encourages using language primitives, such as keywords (lightweight
strings), lists, maps instead of heavy objects
Outcome Adapter logic is just a transformation Reusability increases Easier
composition
Powerful collection fns All Functional languages have amazingly powerful collection
manipulation primitives, such as filter/map/reduce, which always involves conditionals, mutable state, loops and so on.
Outcome Obvious results Thinking in patterns Reusability, describing processes as
sequence of steps Many opportunities instead of a single “for” loop
Inherently concurrent FP languages do not let you modify state,
which prevents using locking structures, synchronisation primitives and allows thinking of state as “value at a time”
Outcome Easier to scale Everything is paralellisable
Different polymorphism In different languages, there are different means. For
example, in Clojure you have protocols and multimethods, in Haskell - algebraic data types, type classes and pattern matching
Outcome Dispatch rarely involves any if/else statements It’s easier to
refactor functions to use a common protocol or implement a type class / ADT
Partial evaluation / currying Concept that requires lots of bells
and whistles in Java In both Clojure and Haskell, you can split a function to sequence of partial evaluation calls
Outcome It’s possible to return a partial evaluation result, and
act on it as if it was a future, evaluating it till the end as the rest of args pop in
Lazy evaluation Despite the fact the concept is extremely easy,
it’s seldom used in imperative languages. Most FP languages have built-in primitives for `next` calculation
Example Byte Buffer position generation
(defn positions! "Returns a lazy sequence containing positions of elements"!
[types]! ((fn rpositions [[t & more] current-pos]! (when t! (cons current-pos ! ! ! ! ! (lazy-seq ! ! ! ! ! (rpositions more (+ current-pos (size t))))))) types 0))
Outcome Infinite data structures No mutable state during `next` generation
Generator is easy to read and modify, knowing the semantics No leaks, no accidental captures
Predictable output Because of lack of side-effects, functions generally produce
single output for same input
Outcome Easier to test Easier to debug Smaller error rate
Determinism / potential for optimisation Easier to prove program correctness
Why it matters for us?
Patterns In Consulting, it’s important to identify problem fast and
provide an easily explainable solution
Knowing it before them Adoption of FP languages is growing
every day. Not being able to provide services will leave us with limited business opportunities.
Rapid Prototyping FP languages allow you to express a problem
fast, with minimal effort and provide a working result quicker than imperative one
Mind Flexibility Being able to approach the problem from different
perspective never hurts
FP In Java Reactor is one of my favourite examples
of using FP paradigms even in Java 7. Java 8 and lambdas is a step forward. Being able to use them knowing the context of where they’re coming from opens up a lot of possibilities.
Reactive programming Reactive programming also grows from FP. Having a
function as a callback was used singe ages in FP.
Having more fun @ work Self-explanatory
Questions?