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)

PDF
MySQLとPostgreSQLの基本的なレプリケーション設定比較
Shinya Sugiyama
 
PDF
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Sandesh Rao
 
PPTX
Oracle Management Cloud, OMC architecture
Samir El-Nabawy
 
PDF
OLAP for Big Data (Druid vs Apache Kylin vs Apache Lens)
SANG WON PARK
 
PPTX
New Features for Multitenant in Oracle Database 21c
Markus Flechtner
 
PDF
ちょっと理解に自信がないな という皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
hamaken
 
PDF
Oracle Multitenant meets Oracle RAC 12c OOW13 [CON8706]
Markus Michalewicz
 
PPTX
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
NTT DATA Technology & Innovation
 
PDF
DOAG Oracle Unified Audit in Multitenant Environments
Stefan Oehrli
 
PDF
WASM! WASI! WAGI! WAT?
Stefan Baumgartner
 
PDF
SparkSQL: A Compiler from Queries to RDDs
Databricks
 
PDF
Oracle RAC 19c - the Basis for the Autonomous Database
Markus Michalewicz
 
PDF
DB12c: All You Need to Know About the Resource Manager
Andrejs Vorobjovs
 
PDF
Fig 9-02
Hironobu Suzuki
 
PPTX
Anil nair rac_internals_sangam_2016
Anil Nair
 
PDF
REST vs. Messaging For Microservices
Eberhard Wolff
 
PDF
Red Hat - Corporate Presentation
Renato Adrião
 
PDF
噛み砕いてKafka Streams #kafkajp
Yahoo!デベロッパーネットワーク
 
PDF
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017)
Yahoo!デベロッパーネットワーク
 
PPT
Cassandra Data Model
ebenhewitt
 
MySQLとPostgreSQLの基本的なレプリケーション設定比較
Shinya Sugiyama
 
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Sandesh Rao
 
Oracle Management Cloud, OMC architecture
Samir El-Nabawy
 
OLAP for Big Data (Druid vs Apache Kylin vs Apache Lens)
SANG WON PARK
 
New Features for Multitenant in Oracle Database 21c
Markus Flechtner
 
ちょっと理解に自信がないな という皆さまに贈るHadoop/Sparkのキホン (IBM Datapalooza Tokyo 2016講演資料)
hamaken
 
Oracle Multitenant meets Oracle RAC 12c OOW13 [CON8706]
Markus Michalewicz
 
Anthos を使ったエンタープライズ向けクラスタの設計とアップグレード戦略のススメ(CloudNative Days Tokyo 2021 発表資料)
NTT DATA Technology & Innovation
 
DOAG Oracle Unified Audit in Multitenant Environments
Stefan Oehrli
 
WASM! WASI! WAGI! WAT?
Stefan Baumgartner
 
SparkSQL: A Compiler from Queries to RDDs
Databricks
 
Oracle RAC 19c - the Basis for the Autonomous Database
Markus Michalewicz
 
DB12c: All You Need to Know About the Resource Manager
Andrejs Vorobjovs
 
Fig 9-02
Hironobu Suzuki
 
Anil nair rac_internals_sangam_2016
Anil Nair
 
REST vs. Messaging For Microservices
Eberhard Wolff
 
Red Hat - Corporate Presentation
Renato Adrião
 
噛み砕いてKafka Streams #kafkajp
Yahoo!デベロッパーネットワーク
 
Dragon: A Distributed Object Storage at Yahoo! JAPAN (WebDB Forum 2017)
Yahoo!デベロッパーネットワーク
 
Cassandra Data Model
ebenhewitt
 

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
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
PDF
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
Timothy Rottach - Ramp up on AI Use Cases, from Vector Search to AI Agents wi...
AWS Chicago
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 

Functional Programming with Immutable Data Structures