SlideShare a Scribd company logo
Functional Programming with
Immutable Data Structures
Why Imperative Languages are
Fundamentally Broken in a
Multi-Threaded Environment
Ivar Thorson
Italian Institute of Technology
November 2, 2010
Ivar Thorson
Functional Programming with Immutable Data Structures
Research interests:
Compliant actuation
Hopping Robots
Rigid Body Dynamics Simulations
The Next 37 minutes:
Important abstractions of functional
programming
particularly for a 4-year old language
Functional Programming with Immutable Data Structures
Rich Hickey
What I have learned from his work
Clojure: Blending theoretical abstractions +
practical know-how
Target Audience: C, C++, Java, Matlab
Programmers
Tempting to start with a feature tour!
But you won’t understand why Clojure is
cool without context
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
Actually, I’m going to try to knock the cup
out of your hand.
Three Outdated Concepts
Three Outdated Concepts
1. Variables
Three Outdated Concepts
1. Variables
2. Syntax
Three Outdated Concepts
1. Variables
2. Syntax
3. Object Orientation
Goal is to convince you that
Goal is to convince you that
1. shared mutable data is now a
philosophically bankrupt idea.
Goal is to convince you that
1. shared mutable data is now a
philosophically bankrupt idea.
2. code and data should be structured as
trees
Goal is to convince you that
1. shared mutable data is now a
philosophically bankrupt idea.
2. code and data should be structured as
trees
3. OOP isn’t the best way to achieve
OOP’s goals
Speaking bluntly
Speaking bluntly
1. everything you know is wrong (15 min)
Speaking bluntly
1. everything you know is wrong (15 min)
2. lisp parentheses are better than syntax
(10 min)
Speaking bluntly
1. everything you know is wrong (15 min)
2. lisp parentheses are better than syntax
(10 min)
3. OOP inheritance sucks (5 min)
disclaimer: some hyperbole in previous
statements
Oh noes, too many parentheses!
Good reasons for parentheses
Good reasons for parentheses
1. Lisp is homoiconic
Good reasons for parentheses
1. Lisp is homoiconic
2. Parentheses uniquely define tree-shaped
computations
Good reasons for parentheses
1. Lisp is homoiconic
2. Parentheses uniquely define tree-shaped
computations
3. Parentheses enable structural editing
For now, please be patient
Introduction: Motivation for multi-threaded
programming
Functional Programming with Immutable Data Structures
1. Last 40 years: Moore’s Law
1. Last 40 years: Moore’s Law
2. “Transistor count will double every 2
years”
# of transistors ≈ CPU performance
Functional Programming with Immutable Data Structures
Constraining physical relationship between
power density, swiching time, oxide thickness
Functional Programming with Immutable Data Structures
The future of hardware is increasingly parallel
The future of software will be ruled by
Amdahl’s law
Functional Programming with Immutable Data Structures
Some things are sequential: Two women
cannot have a baby in 4.5 months.
Functional Programming with Immutable Data Structures
1. Dividing up work is already a hard
design task
1. Dividing up work is already a hard
design task
2. Resource contention makes this problem
harder
Common multi-threaded bugs:
Common multi-threaded bugs:
Invalid state
Common multi-threaded bugs:
Invalid state
Race conditions
Common multi-threaded bugs:
Invalid state
Race conditions
Deadlocks
Common multi-threaded bugs:
Invalid state
Race conditions
Deadlocks
Livelocks
Common multi-threaded bugs:
Invalid state
Race conditions
Deadlocks
Livelocks
Resource starvation
What if most bugs were merely due to the
imperative programming model?
Part 1: The Functional Programming Style
Functional Programming with Immutable Data Structures
Pure functions always return the same result
when they get the same input.
Pure functions don’t...
Pure functions don’t...
...look outside their box
Pure functions don’t...
...look outside their box
...modify anything, anywhere
Pure functions don’t...
...look outside their box
...modify anything, anywhere
...print messages to the user
Pure functions don’t...
...look outside their box
...modify anything, anywhere
...print messages to the user
...write to disk
Pure functions have no side effects
Nothing would change if you ran the function
again – anywhere!
f (x) = x2
+ 1
Pure functions just return a value, and do
nothing more.
Pure functions compose to other pure
functions
Functional Programming with Immutable Data Structures
f (a, b, c) = (a + b)/(c ∗ 2)
Languages that emphasize the use of pure
functions are called functional languages
Imperative languages describe computation
in terms of changes to state.
C, C++, Java, and most engineering
languages are imperative.
Imperative languages describe memory
operations instead of purely functional
operations.
Functional Programming with Immutable Data Structures
Imperative style: directly causing side effects
on memory.
The assignment operator changes
memory...often a side effect!
Could you write a C program...
Could you write a C program...
without any non-local variables?
Could you write a C program...
without any non-local variables?
where = is only used for initialization?
Next: Variables are fundamentally a bad
abstraction in multithreaded environments.
Claim #1. Shared mutable data is now
philosophically bankrupt
Functional Programming with Immutable Data Structures
x = x + 1
x = x + 1
x = 3 (...last time I checked!)
x = x + 1
x = 3 (...last time I checked!)
In my universe, 3 = 3 + 1 is never true
The Big Problem: the concept of variables
encourage us to forget about time.
x[t] = x0
x[t + 1] = x[t] + 1
The value of x for a given t is immutable
and unchanging!
The Most Important Slide
The Most Important Slide
x is a name, an identity of a sequence of
values
The Most Important Slide
x is a name, an identity of a sequence of
values
x has different values at different times
The Most Important Slide
x is a name, an identity of a sequence of
values
x has different values at different times
The values of x are related by pure
functions
The Most Important Slide
x is a name, an identity of a sequence of
values
x has different values at different times
The values of x are related by pure
functions
In this case, by the increment function
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
The idea of a variable confuses identity and
the most current value!
Functional Programming with Immutable Data Structures
Locking: a tactic for winning a battle.
What we need is a strategy to win the war.
“What if all data was immutable?” – Rich
Hickey (not the first one to ask this question)
Keeping Old Immutable Data
Keeping Old Immutable Data
x@(t=0) → 5
Keeping Old Immutable Data
x@(t=0) → 5
x@(t=1) → 6
Keeping Old Immutable Data
x@(t=0) → 5
x@(t=1) → 6
x@(t=13) → 7
Keeping Old Immutable Data
x@(t=0) → 5
x@(t=1) → 6
x@(t=13) → 7
x@(t=15) → 8
Keeping Old Immutable Data
x@(t=0) → 5
x@(t=1) → 6
x@(t=13) → 7
x@(t=15) → 8
...
Functional Programming with Immutable Data Structures
The old values of the data are kept and
indexed by time
The old values of the data are kept and
indexed by time
Data is immutable once created – we
cannot/will not change it!
The old values of the data are kept and
indexed by time
Data is immutable once created – we
cannot/will not change it!
Values only destroyed when unneeded
Doesn’t keeping old copies of data consume
too much memory?
Functional Programming with Immutable Data Structures
(a b c) + d = (a b c d)
(a b c) + d = (a b c d)
What if the input and output shared
structure?
(a b c) + d = (a b c d)
What if the input and output shared
structure?
Sharing structure is dangerous for
mutable data
(a b c) + d = (a b c d)
What if the input and output shared
structure?
Sharing structure is dangerous for
mutable data
...but sharing structure is safe if the
data is immutable.
The Trick: Represent the list as a tree
input tree → pure function → output tree
Functional Programming with Immutable Data Structures
both trees are immutable but distinct
Same approach works also for insertions,
modifications, deletions, and all other list
operations.
a million threads, a million trees, a million
references to trees, zero locks
If you want a more current worldview, just
get its reference
Advantages of immutable trees:
Advantages of immutable trees:
No locking required
Advantages of immutable trees:
No locking required
No ’stopping the world’ to see (readers
don’t block writers)
Advantages of immutable trees:
No locking required
No ’stopping the world’ to see (readers
don’t block writers)
Worldview never becomes corrupted
Advantages of immutable trees:
No locking required
No ’stopping the world’ to see (readers
don’t block writers)
Worldview never becomes corrupted
Minimizes memory use while
maintaining multiple copies
Advantages of immutable trees:
No locking required
No ’stopping the world’ to see (readers
don’t block writers)
Worldview never becomes corrupted
Minimizes memory use while
maintaining multiple copies
Unused nodes are garbage-collected
We’ve gone a long way, but we’re only half
way to real concurrency
Functional Programming with Immutable Data Structures
Immutability lets us read concurrently, but
not write concurrently to a single piece of
data
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
How can we coordinate the actions of
different threads working on the same data
at the same time?
”Treat changes in an identity’s value as a
database transaction.” – Rich Hickey
Database Details:
Database Details:
Software Transactional Memory (STM)
Database Details:
Software Transactional Memory (STM)
Multi-Version Concurrency Control
(MVCC)
The STM Guarantees:
The STM Guarantees:
Atomicity (All or nothing)
The STM Guarantees:
Atomicity (All or nothing)
Consistency (Validation before commits)
The STM Guarantees:
Atomicity (All or nothing)
Consistency (Validation before commits)
Isolation (Transactions can’t see each
other)
Functional Programming with Immutable Data Structures
Transactions are speculative and may be
retried if there is a collision.
For even more concurrency:
For even more concurrency:
Sometimes you don’t care about the
order of function application
For even more concurrency:
Sometimes you don’t care about the
order of function application
Commutative writers won’t need to retry
For even more concurrency:
Sometimes you don’t care about the
order of function application
Commutative writers won’t need to retry
Writers don’t interfere with other
writers!
Functional Programming with Immutable Data Structures
STMs exist for other languages...
STMs exist for other languages...
... but Clojure is first to have built-in
STM with pervasive immutability
Part 1 Summary: In Clojure...
Part 1 Summary: In Clojure...
...Readers don’t block anybody
Part 1 Summary: In Clojure...
...Readers don’t block anybody
...Writers don’t block anybody
Part 1 Summary: In Clojure...
...Readers don’t block anybody
...Writers don’t block anybody
...Writers retry if conflicting
Part 1 Summary: In Clojure...
...Readers don’t block anybody
...Writers don’t block anybody
...Writers retry if conflicting
...Writers don’t retry if commutative
Variables couldn’t do this because:
Variables couldn’t do this because:
Confuse identity and values
Variables couldn’t do this because:
Confuse identity and values
Are mutable and can be corrupted
Variables couldn’t do this because:
Confuse identity and values
Are mutable and can be corrupted
Assume a single thread of control, no
interruptions
Variables couldn’t do this because:
Confuse identity and values
Are mutable and can be corrupted
Assume a single thread of control, no
interruptions
Maintain only the last written copy
”Mutable stateful objects are the new
spaghetti code” – Rich Hickey
”We oppose the uncontrolled mutation of
variables.” – Stuart Halloway
”Mutable objects are a concurrency
disaster.” – Rich Hickey
”The future is a function of the past, but
doesn’t change it.” – Rich Hickey
”Many people can watch a baseball game,
but only one can be at bat.” – Rich Hickey
Part 2: Revenge of the Lisp
Claim #2: Your language’s syntax is
unneccesarily complex
Now we’ll explain why lisp has parentheses!
Functional Programming with Immutable Data Structures
Pure functions represent computation as
trees
Reason 1: The tree structure is made
explicitly visible by the parentheses
Sorry, Haskell/Erlang/OCaml/ML/etc!
Infix Notation
1 + 1
Prefix Notation
(+ 1 1)
(fn arg1 arg2 arg3 ...)
1 + 2 + 3 + 4
(+ 1 2 3 4)
With prefix notation, you can forget about
the rules of precedence.
6 + 12 / 2 * 3
(6 + 12) / (2 * 3)
(/ (+ 6 12) (* 2 3))
(/ (+ 6p
12)
(* 2
3))
Triangular Tree Structure
Functional Programming with Immutable Data Structures
Lisp code’s tree of computation is
exceptionally visible and regular.
Reason 2: Homoiconicity
Homoiconic = Homo + icon = ”same” +
”representation”
The property where code & a language
primitive look the same.
An example: Writing C with XML
for (i=0; i<100; i++) {
printf("%dn", i);
dostuff();
}
<for>
<init>i = 0</init>
<test>i < 100</test>
<count>i++</count>
<body>
<print format="%d" args="i"/>
<dostuff/>
</body>
</for>
Imagine how simple it would be to use an
XML generator to emit compilable source
code.
We could modify our code programmatically.
In lisp, you can write programs that write
programs.
(list 1 2 3) -> (1 2 3)
(list ’+ 1 2 3) -> (+ 1 2 3)
(+ 1 2 3) -> 6
(defmacro and
([] true)
([x] x)
([x & rest]
‘(let [and# ~x]
(if and# (and ~@rest) and#))))
Why lispers go nuts:
Why lispers go nuts:
Macros in lisp are far more powerful
than in other languages.
Why lispers go nuts:
Macros in lisp are far more powerful
than in other languages.
You can build new constructs that are
just as legitimate as existing constructs
like if
Why lispers go nuts:
Macros in lisp are far more powerful
than in other languages.
You can build new constructs that are
just as legitimate as existing constructs
like if
You can abstract away boilerplate code
Aside
Aside
If Java used parentheses properly, XML
wouldn’t exist
Aside
If Java used parentheses properly, XML
wouldn’t exist
Lisp parentheses describe structure
Aside
If Java used parentheses properly, XML
wouldn’t exist
Lisp parentheses describe structure
Most languages use ad-hoc syntax, data
formats
Aside
If Java used parentheses properly, XML
wouldn’t exist
Lisp parentheses describe structure
Most languages use ad-hoc syntax, data
formats
Simplicity is elegance
Reason 3: Structural Editing
Good editors let you work with code in
blocks and forget about the parentheses.
Hard-to-show Examples
Hard-to-show Examples
When you type (, emacs adds the )
Hard-to-show Examples
When you type (, emacs adds the )
Indentation is automatic
Hard-to-show Examples
When you type (, emacs adds the )
Indentation is automatic
You can easily navigate heirarchically
Hard-to-show Examples
When you type (, emacs adds the )
Indentation is automatic
You can easily navigate heirarchically
Take next three expressions, apply them
to a function
Summary of Lisp Parentheses
Summary of Lisp Parentheses
Parentheses render explicit the
tree-structure of your program
Summary of Lisp Parentheses
Parentheses render explicit the
tree-structure of your program
Homoiconicity lets you write programs
with programs
Summary of Lisp Parentheses
Parentheses render explicit the
tree-structure of your program
Homoiconicity lets you write programs
with programs
Structural Editing is fun and easy
Syntax is bad because
Syntax is bad because
It hides the program’s structure
Syntax is bad because
It hides the program’s structure
It destroys homoiconicity
Syntax is bad because
It hides the program’s structure
It destroys homoiconicity
It is needlessly complex
”Things should be made as simple as
possible – but no simpler.” – Albert Einstein
Part 3: OOP isn’t the only path to
Polymorphism and Code Reuse
OOP has good goals
OOP has good goals
1. to group objects together
OOP has good goals
1. to group objects together
2. to encapsulate
OOP has good goals
1. to group objects together
2. to encapsulate
3. to dispatch polymorphically
OOP has good goals
1. to group objects together
2. to encapsulate
3. to dispatch polymorphically
4. to reuse code
These are all good ideas and good goals.
However, OOP is not the only way to reach
these goals.
Claim #3: ”Functions compose better than
objects.”
The fundamental mechanism of OOP – the
inheritance of data, interfaces, type, or
methods from a parent – is often more
difficult to use in practice than techniques
that use functions to achieve the same effect.
Functions are simpler than objects.
Objects are semantic compounds of types,
data, and methods.
Implementation inheritance is bad:
Implementation inheritance is bad:
Forces “is-a” relationship instead of
“has-a”, and “has-a” is almost always
better
Implementation inheritance is bad:
Forces “is-a” relationship instead of
“has-a”, and “has-a” is almost always
better
Heirarchical nominalization is difficult
Implementation inheritance is bad:
Forces “is-a” relationship instead of
“has-a”, and “has-a” is almost always
better
Heirarchical nominalization is difficult
Changes to a class affect all the
subclasses
An example will help clarify.
Balls
Balls
Ball class (presumably round)
Balls
Ball class (presumably round)
rollingBall subclass
Balls
Ball class (presumably round)
rollingBall subclass
bouncingBall subclass
Problems
Problems
What happens if we want to make a ball
that both rolls and bounces?
Problems
What happens if we want to make a ball
that both rolls and bounces?
Do/Can we inherit from both?
Problems
What happens if we want to make a ball
that both rolls and bounces?
Do/Can we inherit from both?
What if our ball cracks and loses its
bounciness?
Problems
What happens if we want to make a ball
that both rolls and bounces?
Do/Can we inherit from both?
What if our ball cracks and loses its
bounciness?
Is a non-round rugby ball a subclass of
ball too?
Interfaces are Simpler
Interfaces are Simpler
Define functional interfaces, but don’t
inherit the implementation
Interfaces are Simpler
Define functional interfaces, but don’t
inherit the implementation
If you want to use another object’s
function to accomplish a task, just use it
Interfaces are Simpler
Define functional interfaces, but don’t
inherit the implementation
If you want to use another object’s
function to accomplish a task, just use it
No need to encapsulate their function in
an object
Interfaces are Simpler
Define functional interfaces, but don’t
inherit the implementation
If you want to use another object’s
function to accomplish a task, just use it
No need to encapsulate their function in
an object
Multiple interfaces are simpler than
multiple inheritance
FREE THE VERBS!! Separate your object
methods from your objects!
Example: Single vs Multiple Dispatch
Making Drum Noises
Making Drum Noises
Drum, cymbal and stick classes
Making Drum Noises
Drum, cymbal and stick classes
When I hit something with the stick, it
makes a noise
Making Drum Noises
Drum, cymbal and stick classes
When I hit something with the stick, it
makes a noise
Single Dispatch:
drum.makeNoise(drumstick)
Making Drum Noises
Drum, cymbal and stick classes
When I hit something with the stick, it
makes a noise
Single Dispatch:
drum.makeNoise(drumstick)
cymbal.makeNoise(drumstick)
The verbs are owned by the nouns.
But what happens when I add a different
stick class?
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
Now I will need to modify the drum and
cymbal classes and add new methods to
handle the mallets!
When two objects hit, the sound is function
of both objects.
With multi-method functions
With multi-method functions
hit(drumstick, cymbal) = crash
With multi-method functions
hit(drumstick, cymbal) = crash
hit(mallet, cymbal) = roar
With multi-method functions
hit(drumstick, cymbal) = crash
hit(mallet, cymbal) = roar
hit(drumstick, drum) = bam
With multi-method functions
hit(drumstick, cymbal) = crash
hit(mallet, cymbal) = roar
hit(drumstick, drum) = bam
hit(mallet, drum) = bom
With multi-method functions
hit(drumstick, cymbal) = crash
hit(mallet, cymbal) = roar
hit(drumstick, drum) = bam
hit(mallet, drum) = bom
hit(drumstick, drumstick) = click
With multi-method functions
hit(drumstick, cymbal) = crash
hit(mallet, cymbal) = roar
hit(drumstick, drum) = bam
hit(mallet, drum) = bom
hit(drumstick, drumstick) = click
hit(cymbal, cymbal) = loud crash
IMPORTANT: hit() is not a single function,
but a collection of functions. (It is called a
multi-method or generic function)
The particular function that is called is
determined by the type of both of its
arguments.
As you add more classes, just add more
definitions of hit().
Part 3 Conclusion
Part 3 Conclusion
Polymorphism is better done through
interfaces than subtype inheritance.
Part 3 Conclusion
Polymorphism is better done through
interfaces than subtype inheritance.
Functions do not require a heirarchy
Part 3 Conclusion
Polymorphism is better done through
interfaces than subtype inheritance.
Functions do not require a heirarchy
Functions allow simple multiple dispatch
The End
Any Questions?

More Related Content

What's hot (20)

PPTX
多脚移動ロボットの脚先センサの開発と各脚における複数の局所制御の統合
Inagaki-lab
 
PDF
Gestion de production (1).pdf
shaymaMensi
 
PPTX
Atelier solution focus principe agile
stephane cauchy
 
PDF
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
 
PPTX
04 aula estocagem
Homero Alves de Lima
 
PDF
Web-formation | Les outils Lean sur la variabilité
XL Groupe
 
PDF
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Leinylson Fontinele
 
PDF
性能測定道 事始め編
Yuto Hayamizu
 
PDF
Boost.SIMD
Akira Takahashi
 
PPTX
06 aula just in time e kanban
Homero Alves de Lima
 
PDF
非線形データの次元圧縮 150905 WACODE 2nd
Mika Yoshimura
 
PPT
IntroduçãO à AdministraçãO De Materiais
lvalini
 
PDF
ZDD入門-お姉さんを救う方法
nishio
 
PDF
Ordenação
Sérgio Souza Costa
 
PDF
プログラミングコンテストでのデータ構造
Takuya Akiba
 
PDF
グラフと木
京大 マイコンクラブ
 
PPTX
[DL輪読会]Understanding deep learning requires rethinking generalization
Deep Learning JP
 
PPTX
MLデザインパターン入門_Embeddings
Masakazu Shinoda
 
PDF
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
 
PPTX
SVMについて
mknh1122
 
多脚移動ロボットの脚先センサの開発と各脚における複数の局所制御の統合
Inagaki-lab
 
Gestion de production (1).pdf
shaymaMensi
 
Atelier solution focus principe agile
stephane cauchy
 
多倍長整数の乗算と高速フーリエ変換
京大 マイコンクラブ
 
04 aula estocagem
Homero Alves de Lima
 
Web-formation | Les outils Lean sur la variabilité
XL Groupe
 
Estrutura de Dados - Aula 12 - Pesquisa de Dados (Sequencial e Binária)
Leinylson Fontinele
 
性能測定道 事始め編
Yuto Hayamizu
 
Boost.SIMD
Akira Takahashi
 
06 aula just in time e kanban
Homero Alves de Lima
 
非線形データの次元圧縮 150905 WACODE 2nd
Mika Yoshimura
 
IntroduçãO à AdministraçãO De Materiais
lvalini
 
ZDD入門-お姉さんを救う方法
nishio
 
Ordenação
Sérgio Souza Costa
 
プログラミングコンテストでのデータ構造
Takuya Akiba
 
[DL輪読会]Understanding deep learning requires rethinking generalization
Deep Learning JP
 
MLデザインパターン入門_Embeddings
Masakazu Shinoda
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
 
SVMについて
mknh1122
 

Similar to Functional Programming with Immutable Data Structures (20)

PPT
Clojure slides
mcohen01
 
PDF
Thinking Outside the Synchronisation Quadrant
Kevlin Henney
 
PDF
If You Think You Can Stay Away from Functional Programming, You Are Wrong
Mario Fusco
 
KEY
The Joy Of Functional Programming
jasondew
 
PDF
Comparing different concurrency models on the JVM
Mario Fusco
 
PDF
Rubyslava slides-26.09.2013
Jan Herich
 
PDF
Functional programming
ijcd
 
ODP
Mario Fusco - Comparing different concurrency models on the JVM | Codemotion ...
Codemotion
 
PDF
Introduction to multicore .ppt
Rajagopal Nagarajan
 
PDF
Peyton jones-2011-parallel haskell-the_future
Takayuki Muranushi
 
PDF
Simon Peyton Jones: Managing parallelism
Skills Matter
 
PDF
Persistent Data Structures by @aradzie
Vasil Remeniuk
 
DOC
Advance data structure
ashok kumar
 
PDF
Immutable, and More
Chase Zhang
 
PDF
I know Java, why should I consider Clojure?
sbjug
 
PDF
Functional programming with clojure
Lucy Fang
 
PPTX
Software_engineering.pptx
john6938
 
PDF
Why we cannot ignore Functional Programming
Mario Fusco
 
PPTX
a brief explanation on the topic of Imperative Programming Paradigm.pptx
sajit20
 
KEY
Scala: functional programming for the imperative mind
Sander Mak (@Sander_Mak)
 
Clojure slides
mcohen01
 
Thinking Outside the Synchronisation Quadrant
Kevlin Henney
 
If You Think You Can Stay Away from Functional Programming, You Are Wrong
Mario Fusco
 
The Joy Of Functional Programming
jasondew
 
Comparing different concurrency models on the JVM
Mario Fusco
 
Rubyslava slides-26.09.2013
Jan Herich
 
Functional programming
ijcd
 
Mario Fusco - Comparing different concurrency models on the JVM | Codemotion ...
Codemotion
 
Introduction to multicore .ppt
Rajagopal Nagarajan
 
Peyton jones-2011-parallel haskell-the_future
Takayuki Muranushi
 
Simon Peyton Jones: Managing parallelism
Skills Matter
 
Persistent Data Structures by @aradzie
Vasil Remeniuk
 
Advance data structure
ashok kumar
 
Immutable, and More
Chase Zhang
 
I know Java, why should I consider Clojure?
sbjug
 
Functional programming with clojure
Lucy Fang
 
Software_engineering.pptx
john6938
 
Why we cannot ignore Functional Programming
Mario Fusco
 
a brief explanation on the topic of Imperative Programming Paradigm.pptx
sajit20
 
Scala: functional programming for the imperative mind
Sander Mak (@Sander_Mak)
 
Ad

More from elliando dias (20)

PDF
Clojurescript slides
elliando dias
 
PDF
Why you should be excited about ClojureScript
elliando dias
 
PPT
Nomenclatura e peças de container
elliando dias
 
PDF
Geometria Projetiva
elliando dias
 
PDF
Polyglot and Poly-paradigm Programming for Better Agility
elliando dias
 
PDF
Javascript Libraries
elliando dias
 
PDF
How to Make an Eight Bit Computer and Save the World!
elliando dias
 
PDF
Ragel talk
elliando dias
 
PDF
A Practical Guide to Connecting Hardware to the Web
elliando dias
 
PDF
Introdução ao Arduino
elliando dias
 
PDF
Minicurso arduino
elliando dias
 
PDF
Incanter Data Sorcery
elliando dias
 
PDF
Rango
elliando dias
 
PDF
Fab.in.a.box - Fab Academy: Machine Design
elliando dias
 
PDF
The Digital Revolution: Machines that makes
elliando dias
 
PDF
Hadoop + Clojure
elliando dias
 
PDF
Hadoop - Simple. Scalable.
elliando dias
 
PDF
Hadoop and Hive Development at Facebook
elliando dias
 
PDF
Multi-core Parallelization in Clojure - a Case Study
elliando dias
 
PDF
From Lisp to Clojure/Incanter and RAn Introduction
elliando dias
 
Clojurescript slides
elliando dias
 
Why you should be excited about ClojureScript
elliando dias
 
Nomenclatura e peças de container
elliando dias
 
Geometria Projetiva
elliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
elliando dias
 
Javascript Libraries
elliando dias
 
How to Make an Eight Bit Computer and Save the World!
elliando dias
 
Ragel talk
elliando dias
 
A Practical Guide to Connecting Hardware to the Web
elliando dias
 
Introdução ao Arduino
elliando dias
 
Minicurso arduino
elliando dias
 
Incanter Data Sorcery
elliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
elliando dias
 
The Digital Revolution: Machines that makes
elliando dias
 
Hadoop + Clojure
elliando dias
 
Hadoop - Simple. Scalable.
elliando dias
 
Hadoop and Hive Development at Facebook
elliando dias
 
Multi-core Parallelization in Clojure - a Case Study
elliando dias
 
From Lisp to Clojure/Incanter and RAn Introduction
elliando dias
 
Ad

Recently uploaded (20)

PDF
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PDF
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
Biography of Daniel Podor.pdf
Daniel Podor
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 

Functional Programming with Immutable Data Structures