SlideShare a Scribd company logo
1 of 32
Download to read offline
Zippers
David Overton
1 August 2013
Table of Contents
1 Motivation
2 List Zipper
3 Tree Zippers
4 Algebraic Data Types
5 Type Differentiation
6 Conclusion
Motivation
Navigating around in and updating mutable data structures is easy:
• Keep a pointer to your current location in the data structure;
• Update the pointer to move around the data structure;
• Modify the data structure using destructive update via the pointer.
Example (C Array)
char my_array[1024];
char *p = my_array;
// Move right
p++;
// Move left
p--;
// Update focused element
*p = ’A’;
Motivation
But what is the equivalent for an immutable data structure? I.e. how do we keep track
of a local focus point within a data structure? E.g. XML document tree, text editor
buffer, window manager stack (e.g. XMonad), AVL tree.
For a list we could use an integer to represent the element we are interested in:
type ListFocus a = (Int, [a])
but this requires traversing from the start of the list every time – an O(n) operation.
For more complex types, this is even less practical.
Instead, we can use a data structure called a zipper.
Table of Contents
1 Motivation
2 List Zipper
3 Tree Zippers
4 Algebraic Data Types
5 Type Differentiation
6 Conclusion
List Zipper
-- A list zipper is a pair consisting of the front
-- of the list (reversed) and the rear of the list.
type ListZipper a = ([a], [a])
-- Convert a list to a zipper.
-- Start at the front of the list.
fromList :: [a] → ListZipper a
fromList xs = ([], xs)
List Zipper
-- Move about in the zipper.
right, left :: ListZipper a → ListZipper a
right (xs, y:ys) = (y:xs, ys)
left (x:xs, ys) = (xs, x:ys)
-- Modify the focused element.
modify :: (a → a) → ListZipper a → ListZipper a
modify f (xs, y:ys) = (xs, (f y):ys)
modify _ zs = zs
-- When we are finished, convert back to a list.
toList :: ListZipper a → [a]
toList ([], ys) = ys
toList zs = toList (left zs)
*Main> let z = fromList [’a’, ’b’, ’c’]
*Main> z
("","abc")
a
ctx list
b
c
*Main> right z
("a","bc")
a
ctx list
b
c
*Main> right $ right z
("ba","c")
a
ctx list
b c
*Main> right $ right $ right z
("cba","")
a
ctx list
b
c
List Zipper
Example (XMonad)
XMonad is a tiling window manager for X written in Haskell. The main data structure
for managing workspace and window focus uses nested list zippers.
type StackSet a = ListZipper (Workspace a)
type Workspace a = ListZipper (Window a)
This allows XMonad to keep track of the focused workspace in an ordered list of
workspaces and also keep track of the focused window on each workspace.
(This is a simplification of the actual types used. The zippers that XMonad uses allow
wrapping when you reach the end of the window or workspace list.)
Table of Contents
1 Motivation
2 List Zipper
3 Tree Zippers
4 Algebraic Data Types
5 Type Differentiation
6 Conclusion
Binary Tree
data Tree a
= Empty
| Node (Tree a) a (Tree a)
deriving Show
type Context a = Either (a, Tree a) (a, Tree a)
type TreeZipper a = ([Context a], Tree a)
fromTree :: Tree a → TreeZipper a
fromTree t = ([], t)
right, left, up :: TreeZipper a → TreeZipper a
right (ctx, Node l a r) = (Right (a, l) : ctx, r)
left (ctx, Node l a r) = (Left (a, r) : ctx, l)
Binary Tree
up (Left (a, r) : ctx, l) = (ctx, Node l a r)
up (Right (a, l) : ctx, r) = (ctx, Node l a r)
modify :: (a → a) → TreeZipper a → TreeZipper a
modify f (ctx, Node l a r) = (ctx, Node l (f a) r)
modify f z = z
toTree :: TreeZipper a → Tree a
toTree ([], t) = t
toTree z = toTree (up z)
*Main> let t = Node
(Node
(Node Empty ’d’ Empty)
’b’
(Node Empty ’e’ Empty))
’a’
(Node
(Node Empty ’f’ Empty)
’c’
(Node Empty ’g’ Empty))
*Main> fromTree t
a
cb
ed gf
ctx tree
*Main> right $ fromTree t
( [Right (’a’,
Node
(Node Empty ’d’ Empty)
’b’
(Node Empty ’e’ Empty))],
Node
(Node Empty ’f’ Empty)
’c’
(Node Empty ’g’ Empty) )
Right
a c
b
ed
gf
ctx tree
*Main> left $ right $ fromTree t
( [ Left (’c’, Node Empty ’g’ Empty),
Right (’a’,
Node
(Node Empty ’d’ Empty)
’b’
(Node Empty ’e’ Empty))],
Node Empty ’f’ Empty )
Right
Left
a
c
b
ed
g
f
ctx tree
Tree Zippers
Example (XML)
• XPath navigation around an XML document is basically a zipper – you have a
current context and methods to navigate to neighbouring nodes.
• One implementation of this in Haskell is the rose tree zipper from HXT.
data NTree a = NTree a [NTree a] -- A rose tree
data NTCrumb = NTC [NTree a] a [NTree a] -- "Breadcrumb" for context
-- The zipper itself
data NTZipper a = NTZ { ntree :: NTree a, context :: [NTCrumb a] }
-- And using it to represent XML
type XmlTree = NTree XNode
type XmlNavTree = NTZipper XNode
data XNode = XText String | XTag QName [XmlTree] | XAttr QName | · · ·
Table of Contents
1 Motivation
2 List Zipper
3 Tree Zippers
4 Algebraic Data Types
5 Type Differentiation
6 Conclusion
Algebraic Data Types
Why are the types in languages such as Haskell sometimes referred to as Algebraic
Data Types? One way to see the relationship to algebra is to convert the types to
algebraic expressions which represent the number of values that a type has.
data Void ⇔ 0 The empty type
data () = () ⇔ 1 The unit type
data Either a b = Left a | Right b ⇔ a + b A sum type
type Pair a b = (a, b) ⇔ a.b A product type
Technically, Haskell types form an algebraic structure called a semiring.
Some more examples:
data Bool = False | True ⇔ 2
data Maybe a = Nothing | Just a ⇔ 1 + a
type Func a b = a -> b ⇔ ba An exponential type
Int ⇔ 232 or 264 (implementation dependent)
Algebraic Laws
The usual algebraic laws (for semirings) hold, up to type “equivalence”:
0 + a = a ⇔ Either Void a ∼= a
a + b = b + a ⇔ Either a b ∼= Either b a
0.a = 0 ⇔ (Void, a) ∼= Void
1.a = a ⇔ ((), a) ∼= a
a.b = b.a ⇔ (a, b) ∼= (b, a)
a.(b + c) = a.b + a.c ⇔ (a, Either b c) ∼= Either (a,b) (a,c)
(cb)a = cb.a ⇔ a -> b -> c ∼= (a, b) -> c
a2 = a.a ⇔ Bool -> a ∼= (a, a)
Algebra of the List Type
data List a = Nil | Cons a (List a)
L(a) = 1 + a.L(a)
= 1 + a.(1 + a.L(a))
= 1 + a + a2(1 + a.L(a))
= 1 + a + a2 + a3 + a4 + · · ·
So a list has either 0 elements or 1 element or 2 elements or . . . (which we already
knew!).
Alternatively, solving for L(a):
L(a) − a.L(a) = 1
(1 − a).L(a) = 1
L(a) =
1
1 − a
It doesn’t seem to make much sense to do subtraction or division on types. But look
at the Taylor series expansion:
1
1 − a
= 1 + a + a2 + a3 + a4 + · · ·
Algebra of Tree Types
data Tree a = Empty | Node (Tree a) a (Tree a)
T(a) = 1 + a.T(a)2
a.T(a)2 − T(a) + 1 = 0
T(a) =
1 −
√
1 − 4.a
2.a
= 1 + a + 2a2 + 5a3 + 14a4 + · · ·
via the quadratic formula and Taylor series expansion. But now we are taking square
roots of types!
Table of Contents
1 Motivation
2 List Zipper
3 Tree Zippers
4 Algebraic Data Types
5 Type Differentiation
6 Conclusion
One-Hole Contexts
Definition
The one-hole context of a parameterised type T(a) is the type of data structures you
get if you remove one distinguished element of type a from a data structure of type
T(a) and somehow mark the hole where the element came from.
Example
type Triple a = (a, a, a)
The one-hole contexts are ( , a, a), (a, , a), and (a, a, ). A type that could
represent this is
data TripleOhc a = Left a a | Mid a a | Right a a
One-Hole Contexts
Look at the algebraic types:
type Triple a = (a, a, a) ⇔ a3
type TripleOhc a = Left a a | Mid a a | Right a a ⇔ 3a2
Notice that
3a2
=
d
da
a3
In fact, this this relationship holds for any parameterised type T(a).
Observation
The type of the one-hole context of any parameterized type T(a) is the derivative type
d
da
T(a) or ∂aT(a)
Zippers from One-Hole Contexts
Observation
For any parameterized type T(a), the type a.∂aT(a) is a zipper for type T(a).
Example
The type
type TripleZipper a = (a, TripleOhc a)
is a zipper for the type Triple a.
TripleZipper(a) = a.3a2
= 3a3
= 3.Triple(a)
But what about some more interesting types . . . ?
List Zipper
L(a) =
1
1 − a
∂aL(a) =
1
(1 − a)2
= L(a)2
ZL(a) = a.∂aL(a) = a.L(a)2
type ListZipper a = (a, [a], [a])
This is slightly different from our original list zipper type ([a], [a]). The
distinguished element is now pulled out of the second list and made explicit. This also
means that the zipper can’t be empty. However, this is still a list zipper and we derived
it using the differential calculus!
Tree Zipper
T(a) = 1 + a.T(a)2
∂aT(a) = T(a)2 + 2a.T(a).∂aT(a)
∂aT(a) =
T(a)2
1 − 2a.T(a)
= T(a)2.L(2a.T(a))
ZT (a) = a.∂aT(a)
= a.T(a)2.L(2a.T(a))
type Context a = Either (a, Tree a) (a, Tree a)
type TreeZipper a = (a, Tree a, Tree a, [Context a])
Table of Contents
1 Motivation
2 List Zipper
3 Tree Zippers
4 Algebraic Data Types
5 Type Differentiation
6 Conclusion
Conclusion
• Zippers are a useful way of navigating and manipulating mutable data structures
in real-world functional programs.
• Algebraic data types really are algebraic.
• Differentiation of types can lead to automatic derivation of zippers.
• Nobody really knows why this works yet — active research.

More Related Content

What's hot

Shuffle phase as the bottleneck in Hadoop Terasort
Shuffle phase as the bottleneck in Hadoop TerasortShuffle phase as the bottleneck in Hadoop Terasort
Shuffle phase as the bottleneck in Hadoop Terasort
pramodbiligiri
 

What's hot (20)

Everyday I'm Shuffling - Tips for Writing Better Spark Programs, Strata San J...
Everyday I'm Shuffling - Tips for Writing Better Spark Programs, Strata San J...Everyday I'm Shuffling - Tips for Writing Better Spark Programs, Strata San J...
Everyday I'm Shuffling - Tips for Writing Better Spark Programs, Strata San J...
 
Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21Apache Calcite Tutorial - BOSS 21
Apache Calcite Tutorial - BOSS 21
 
Spark Summit EU talk by Ted Malaska
Spark Summit EU talk by Ted MalaskaSpark Summit EU talk by Ted Malaska
Spark Summit EU talk by Ted Malaska
 
Domain Driven Design with the F# type System -- NDC London 2013
Domain Driven Design with the F# type System -- NDC London 2013Domain Driven Design with the F# type System -- NDC London 2013
Domain Driven Design with the F# type System -- NDC London 2013
 
Indexing with MongoDB
Indexing with MongoDBIndexing with MongoDB
Indexing with MongoDB
 
Apache Spark's Built-in File Sources in Depth
Apache Spark's Built-in File Sources in DepthApache Spark's Built-in File Sources in Depth
Apache Spark's Built-in File Sources in Depth
 
Rust
RustRust
Rust
 
JSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked DataJSON-LD: JSON for Linked Data
JSON-LD: JSON for Linked Data
 
Left and Right Folds - Comparison of a mathematical definition and a programm...
Left and Right Folds- Comparison of a mathematical definition and a programm...Left and Right Folds- Comparison of a mathematical definition and a programm...
Left and Right Folds - Comparison of a mathematical definition and a programm...
 
Practical Object Oriented Models In Sql
Practical Object Oriented Models In SqlPractical Object Oriented Models In Sql
Practical Object Oriented Models In Sql
 
SQL for NoSQL and how Apache Calcite can help
SQL for NoSQL and how  Apache Calcite can helpSQL for NoSQL and how  Apache Calcite can help
SQL for NoSQL and how Apache Calcite can help
 
Golang Project Layout and Practice
Golang Project Layout and PracticeGolang Project Layout and Practice
Golang Project Layout and Practice
 
Domain Modeling with FP (DDD Europe 2020)
Domain Modeling with FP (DDD Europe 2020)Domain Modeling with FP (DDD Europe 2020)
Domain Modeling with FP (DDD Europe 2020)
 
Sequence and Traverse - Part 1
Sequence and Traverse - Part 1Sequence and Traverse - Part 1
Sequence and Traverse - Part 1
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기
 
Full Text Search In PostgreSQL
Full Text Search In PostgreSQLFull Text Search In PostgreSQL
Full Text Search In PostgreSQL
 
Fast federated SQL with Apache Calcite
Fast federated SQL with Apache CalciteFast federated SQL with Apache Calcite
Fast federated SQL with Apache Calcite
 
Json in Postgres - the Roadmap
 Json in Postgres - the Roadmap Json in Postgres - the Roadmap
Json in Postgres - the Roadmap
 
Designing Structured Streaming Pipelines—How to Architect Things Right
Designing Structured Streaming Pipelines—How to Architect Things RightDesigning Structured Streaming Pipelines—How to Architect Things Right
Designing Structured Streaming Pipelines—How to Architect Things Right
 
Shuffle phase as the bottleneck in Hadoop Terasort
Shuffle phase as the bottleneck in Hadoop TerasortShuffle phase as the bottleneck in Hadoop Terasort
Shuffle phase as the bottleneck in Hadoop Terasort
 

Viewers also liked (10)

ASSQC on snap fasteners and buttons
ASSQC on snap fasteners and buttonsASSQC on snap fasteners and buttons
ASSQC on snap fasteners and buttons
 
Zipper
ZipperZipper
Zipper
 
Basic stitches
Basic stitchesBasic stitches
Basic stitches
 
Different types of button are used in garments
Different types of button are used in garmentsDifferent types of button are used in garments
Different types of button are used in garments
 
Basic hand stitches
Basic hand stitchesBasic hand stitches
Basic hand stitches
 
K to 12 Tailoring/Dressmaking - Basic Hand Stitches
K to 12 Tailoring/Dressmaking - Basic Hand Stitches K to 12 Tailoring/Dressmaking - Basic Hand Stitches
K to 12 Tailoring/Dressmaking - Basic Hand Stitches
 
Basic Hand Stitches
Basic Hand StitchesBasic Hand Stitches
Basic Hand Stitches
 
The Zipper
The ZipperThe Zipper
The Zipper
 
Textile & garments (1)- Trims & accessories of garments
Textile &  garments (1)- Trims & accessories of garmentsTextile &  garments (1)- Trims & accessories of garments
Textile & garments (1)- Trims & accessories of garments
 
Trims & Accessories
Trims & AccessoriesTrims & Accessories
Trims & Accessories
 

Similar to Zippers

Algebraic Data Types and Origami Patterns
Algebraic Data Types and Origami PatternsAlgebraic Data Types and Origami Patterns
Algebraic Data Types and Origami Patterns
Vasil Remeniuk
 
Data structures in scala
Data structures in scalaData structures in scala
Data structures in scala
Meetu Maltiar
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
Vasil Remeniuk
 
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
PROIDEA
 
High Wizardry in the Land of Scala
High Wizardry in the Land of ScalaHigh Wizardry in the Land of Scala
High Wizardry in the Land of Scala
djspiewak
 
Real World Haskell: Lecture 6
Real World Haskell: Lecture 6Real World Haskell: Lecture 6
Real World Haskell: Lecture 6
Bryan O'Sullivan
 

Similar to Zippers (20)

Zippers: Derivatives of Regular Types
Zippers: Derivatives of Regular TypesZippers: Derivatives of Regular Types
Zippers: Derivatives of Regular Types
 
Functional programming with_scala
Functional programming with_scalaFunctional programming with_scala
Functional programming with_scala
 
Fp in scala part 1
Fp in scala part 1Fp in scala part 1
Fp in scala part 1
 
Algebraic Data Types and Origami Patterns
Algebraic Data Types and Origami PatternsAlgebraic Data Types and Origami Patterns
Algebraic Data Types and Origami Patterns
 
Frp2016 3
Frp2016 3Frp2016 3
Frp2016 3
 
Scala. Introduction to FP. Monads
Scala. Introduction to FP. MonadsScala. Introduction to FP. Monads
Scala. Introduction to FP. Monads
 
Array
ArrayArray
Array
 
Data structures in scala
Data structures in scalaData structures in scala
Data structures in scala
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
 
Data Structures In Scala
Data Structures In ScalaData Structures In Scala
Data Structures In Scala
 
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
JDD2015: Functional programing and Event Sourcing - a pair made in heaven - e...
 
List,Stacks and Queues.pptx
List,Stacks and Queues.pptxList,Stacks and Queues.pptx
List,Stacks and Queues.pptx
 
Q
QQ
Q
 
tidyr.pdf
tidyr.pdftidyr.pdf
tidyr.pdf
 
Fp in scala part 2
Fp in scala part 2Fp in scala part 2
Fp in scala part 2
 
Your data structures are made of maths!
Your data structures are made of maths!Your data structures are made of maths!
Your data structures are made of maths!
 
High Wizardry in the Land of Scala
High Wizardry in the Land of ScalaHigh Wizardry in the Land of Scala
High Wizardry in the Land of Scala
 
Real World Haskell: Lecture 6
Real World Haskell: Lecture 6Real World Haskell: Lecture 6
Real World Haskell: Lecture 6
 
R교육1
R교육1R교육1
R교육1
 
[Expert Fridays] Александр Чичигин - Как перестать бояться и полюбить COQ
[Expert Fridays] Александр Чичигин - Как перестать бояться и полюбить COQ[Expert Fridays] Александр Чичигин - Как перестать бояться и полюбить COQ
[Expert Fridays] Александр Чичигин - Как перестать бояться и полюбить COQ
 

Recently uploaded

Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 

Recently uploaded (20)

What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 

Zippers

  • 2. Table of Contents 1 Motivation 2 List Zipper 3 Tree Zippers 4 Algebraic Data Types 5 Type Differentiation 6 Conclusion
  • 3. Motivation Navigating around in and updating mutable data structures is easy: • Keep a pointer to your current location in the data structure; • Update the pointer to move around the data structure; • Modify the data structure using destructive update via the pointer. Example (C Array) char my_array[1024]; char *p = my_array; // Move right p++; // Move left p--; // Update focused element *p = ’A’;
  • 4. Motivation But what is the equivalent for an immutable data structure? I.e. how do we keep track of a local focus point within a data structure? E.g. XML document tree, text editor buffer, window manager stack (e.g. XMonad), AVL tree. For a list we could use an integer to represent the element we are interested in: type ListFocus a = (Int, [a]) but this requires traversing from the start of the list every time – an O(n) operation. For more complex types, this is even less practical. Instead, we can use a data structure called a zipper.
  • 5. Table of Contents 1 Motivation 2 List Zipper 3 Tree Zippers 4 Algebraic Data Types 5 Type Differentiation 6 Conclusion
  • 6. List Zipper -- A list zipper is a pair consisting of the front -- of the list (reversed) and the rear of the list. type ListZipper a = ([a], [a]) -- Convert a list to a zipper. -- Start at the front of the list. fromList :: [a] → ListZipper a fromList xs = ([], xs)
  • 7. List Zipper -- Move about in the zipper. right, left :: ListZipper a → ListZipper a right (xs, y:ys) = (y:xs, ys) left (x:xs, ys) = (xs, x:ys) -- Modify the focused element. modify :: (a → a) → ListZipper a → ListZipper a modify f (xs, y:ys) = (xs, (f y):ys) modify _ zs = zs -- When we are finished, convert back to a list. toList :: ListZipper a → [a] toList ([], ys) = ys toList zs = toList (left zs)
  • 8. *Main> let z = fromList [’a’, ’b’, ’c’] *Main> z ("","abc") a ctx list b c
  • 10. *Main> right $ right z ("ba","c") a ctx list b c
  • 11. *Main> right $ right $ right z ("cba","") a ctx list b c
  • 12. List Zipper Example (XMonad) XMonad is a tiling window manager for X written in Haskell. The main data structure for managing workspace and window focus uses nested list zippers. type StackSet a = ListZipper (Workspace a) type Workspace a = ListZipper (Window a) This allows XMonad to keep track of the focused workspace in an ordered list of workspaces and also keep track of the focused window on each workspace. (This is a simplification of the actual types used. The zippers that XMonad uses allow wrapping when you reach the end of the window or workspace list.)
  • 13. Table of Contents 1 Motivation 2 List Zipper 3 Tree Zippers 4 Algebraic Data Types 5 Type Differentiation 6 Conclusion
  • 14. Binary Tree data Tree a = Empty | Node (Tree a) a (Tree a) deriving Show type Context a = Either (a, Tree a) (a, Tree a) type TreeZipper a = ([Context a], Tree a) fromTree :: Tree a → TreeZipper a fromTree t = ([], t) right, left, up :: TreeZipper a → TreeZipper a right (ctx, Node l a r) = (Right (a, l) : ctx, r) left (ctx, Node l a r) = (Left (a, r) : ctx, l)
  • 15. Binary Tree up (Left (a, r) : ctx, l) = (ctx, Node l a r) up (Right (a, l) : ctx, r) = (ctx, Node l a r) modify :: (a → a) → TreeZipper a → TreeZipper a modify f (ctx, Node l a r) = (ctx, Node l (f a) r) modify f z = z toTree :: TreeZipper a → Tree a toTree ([], t) = t toTree z = toTree (up z)
  • 16. *Main> let t = Node (Node (Node Empty ’d’ Empty) ’b’ (Node Empty ’e’ Empty)) ’a’ (Node (Node Empty ’f’ Empty) ’c’ (Node Empty ’g’ Empty)) *Main> fromTree t a cb ed gf ctx tree
  • 17. *Main> right $ fromTree t ( [Right (’a’, Node (Node Empty ’d’ Empty) ’b’ (Node Empty ’e’ Empty))], Node (Node Empty ’f’ Empty) ’c’ (Node Empty ’g’ Empty) ) Right a c b ed gf ctx tree
  • 18. *Main> left $ right $ fromTree t ( [ Left (’c’, Node Empty ’g’ Empty), Right (’a’, Node (Node Empty ’d’ Empty) ’b’ (Node Empty ’e’ Empty))], Node Empty ’f’ Empty ) Right Left a c b ed g f ctx tree
  • 19. Tree Zippers Example (XML) • XPath navigation around an XML document is basically a zipper – you have a current context and methods to navigate to neighbouring nodes. • One implementation of this in Haskell is the rose tree zipper from HXT. data NTree a = NTree a [NTree a] -- A rose tree data NTCrumb = NTC [NTree a] a [NTree a] -- "Breadcrumb" for context -- The zipper itself data NTZipper a = NTZ { ntree :: NTree a, context :: [NTCrumb a] } -- And using it to represent XML type XmlTree = NTree XNode type XmlNavTree = NTZipper XNode data XNode = XText String | XTag QName [XmlTree] | XAttr QName | · · ·
  • 20. Table of Contents 1 Motivation 2 List Zipper 3 Tree Zippers 4 Algebraic Data Types 5 Type Differentiation 6 Conclusion
  • 21. Algebraic Data Types Why are the types in languages such as Haskell sometimes referred to as Algebraic Data Types? One way to see the relationship to algebra is to convert the types to algebraic expressions which represent the number of values that a type has. data Void ⇔ 0 The empty type data () = () ⇔ 1 The unit type data Either a b = Left a | Right b ⇔ a + b A sum type type Pair a b = (a, b) ⇔ a.b A product type Technically, Haskell types form an algebraic structure called a semiring. Some more examples: data Bool = False | True ⇔ 2 data Maybe a = Nothing | Just a ⇔ 1 + a type Func a b = a -> b ⇔ ba An exponential type Int ⇔ 232 or 264 (implementation dependent)
  • 22. Algebraic Laws The usual algebraic laws (for semirings) hold, up to type “equivalence”: 0 + a = a ⇔ Either Void a ∼= a a + b = b + a ⇔ Either a b ∼= Either b a 0.a = 0 ⇔ (Void, a) ∼= Void 1.a = a ⇔ ((), a) ∼= a a.b = b.a ⇔ (a, b) ∼= (b, a) a.(b + c) = a.b + a.c ⇔ (a, Either b c) ∼= Either (a,b) (a,c) (cb)a = cb.a ⇔ a -> b -> c ∼= (a, b) -> c a2 = a.a ⇔ Bool -> a ∼= (a, a)
  • 23. Algebra of the List Type data List a = Nil | Cons a (List a) L(a) = 1 + a.L(a) = 1 + a.(1 + a.L(a)) = 1 + a + a2(1 + a.L(a)) = 1 + a + a2 + a3 + a4 + · · · So a list has either 0 elements or 1 element or 2 elements or . . . (which we already knew!). Alternatively, solving for L(a): L(a) − a.L(a) = 1 (1 − a).L(a) = 1 L(a) = 1 1 − a It doesn’t seem to make much sense to do subtraction or division on types. But look at the Taylor series expansion: 1 1 − a = 1 + a + a2 + a3 + a4 + · · ·
  • 24. Algebra of Tree Types data Tree a = Empty | Node (Tree a) a (Tree a) T(a) = 1 + a.T(a)2 a.T(a)2 − T(a) + 1 = 0 T(a) = 1 − √ 1 − 4.a 2.a = 1 + a + 2a2 + 5a3 + 14a4 + · · · via the quadratic formula and Taylor series expansion. But now we are taking square roots of types!
  • 25. Table of Contents 1 Motivation 2 List Zipper 3 Tree Zippers 4 Algebraic Data Types 5 Type Differentiation 6 Conclusion
  • 26. One-Hole Contexts Definition The one-hole context of a parameterised type T(a) is the type of data structures you get if you remove one distinguished element of type a from a data structure of type T(a) and somehow mark the hole where the element came from. Example type Triple a = (a, a, a) The one-hole contexts are ( , a, a), (a, , a), and (a, a, ). A type that could represent this is data TripleOhc a = Left a a | Mid a a | Right a a
  • 27. One-Hole Contexts Look at the algebraic types: type Triple a = (a, a, a) ⇔ a3 type TripleOhc a = Left a a | Mid a a | Right a a ⇔ 3a2 Notice that 3a2 = d da a3 In fact, this this relationship holds for any parameterised type T(a). Observation The type of the one-hole context of any parameterized type T(a) is the derivative type d da T(a) or ∂aT(a)
  • 28. Zippers from One-Hole Contexts Observation For any parameterized type T(a), the type a.∂aT(a) is a zipper for type T(a). Example The type type TripleZipper a = (a, TripleOhc a) is a zipper for the type Triple a. TripleZipper(a) = a.3a2 = 3a3 = 3.Triple(a) But what about some more interesting types . . . ?
  • 29. List Zipper L(a) = 1 1 − a ∂aL(a) = 1 (1 − a)2 = L(a)2 ZL(a) = a.∂aL(a) = a.L(a)2 type ListZipper a = (a, [a], [a]) This is slightly different from our original list zipper type ([a], [a]). The distinguished element is now pulled out of the second list and made explicit. This also means that the zipper can’t be empty. However, this is still a list zipper and we derived it using the differential calculus!
  • 30. Tree Zipper T(a) = 1 + a.T(a)2 ∂aT(a) = T(a)2 + 2a.T(a).∂aT(a) ∂aT(a) = T(a)2 1 − 2a.T(a) = T(a)2.L(2a.T(a)) ZT (a) = a.∂aT(a) = a.T(a)2.L(2a.T(a)) type Context a = Either (a, Tree a) (a, Tree a) type TreeZipper a = (a, Tree a, Tree a, [Context a])
  • 31. Table of Contents 1 Motivation 2 List Zipper 3 Tree Zippers 4 Algebraic Data Types 5 Type Differentiation 6 Conclusion
  • 32. Conclusion • Zippers are a useful way of navigating and manipulating mutable data structures in real-world functional programs. • Algebraic data types really are algebraic. • Differentiation of types can lead to automatic derivation of zippers. • Nobody really knows why this works yet — active research.