PURELY FUNCTIONAL
DATA STRUCTURES
BASED ON THE WORK OF CHRIS OKASAKI
BY TEJAS BUBANE
BANGALORE FUNCTIONAL PROGRAMMING MEETUP
https://github.com/tejasbubane/functional-data-structures
Slide 2
Slide 2 text
PURELY FUNCTIONAL ??
▸Immutable
▸Persistent
Slide 3
Slide 3 text
LINKED LIST
data List a =
Nil | Cons a (List a)
Slide 4
Slide 4 text
STRUCTURAL SHARING
xs ++ ys
update xs 2 7
Slide 5
Slide 5 text
QUEUE
data Queue a = Queue [a] [a]
FIFO
Slide 6
Slide 6 text
BINARY SEARCH TREES
data Tree a =
Empty | Node (Tree a) a (Tree a)
log n
Slide 7
Slide 7 text
PATH COPYING
insert ‘e’ xs
Slide 8
Slide 8 text
SKEWED BINARY SEARCH TREES
▸ Depth ~ O(n)
▸ Linear Search Time
Slide 9
Slide 9 text
RED-BLACK TREES
data Color = Red | Black
data RBTree a =
Empty |
Node Color (RBTree a) a (RBTree a)
Slide 10
Slide 10 text
RED-BLACK TREES
▸No red node has red child
▸Every path from root to empty node contains
same number of black nodes
Slide 11
Slide 11 text
RED-BLACK TREES - INSERTION
Slide 12
Slide 12 text
TRIES
Slide 13
Slide 13 text
ANALYSIS
Slide 14
Slide 14 text
AMORTIZED ANALYSIS
data Queue a = Queue [a] [a]
check :: [a] -> [a] -> Queue a
check [] r = Queue (reverse r) []
check f r = Queue f r
Take slowest cost and distribute over
faster ones
Slide 15
Slide 15 text
LAZINESS
▸ Evaluate on demand - Thunks
▸ Memoize results
Slide 16
Slide 16 text
BANKERS QUEUES
check :: Queue a -> Queue a
check q@(Queue lenf fs lenr rs)
| lenf <= lenr =
Queue (lenf + lenr)
(fs ++ reverse rs) 0 []
| otherwise = q
No pattern-matching on lists (fs & rs)
so no evaluation.