Upload
dimas-cabre-i-chacon
View
217
Download
0
Embed Size (px)
Citation preview
8/13/2019 Category Theory an Abstraction for Anything
1/31
@alissapajer
CATEGORY THEORY:
An Abstraction For Anything
8/13/2019 Category Theory an Abstraction for Anything
2/31
TALK OUTLINE
(1)git historyas a Category
(2)terminalandinitialobjects
(3)polymorphismas a Natural
Transformation
(4)curryingas a Natural Transformation
(5)covarianceandcontravariance of
Functors
8/13/2019 Category Theory an Abstraction for Anything
3/31
A
B G
CD H
E F
DIRECTED ACYCLIC GRAPHSgit commit historyis a DAG!
8/13/2019 Category Theory an Abstraction for Anything
4/31
DIRECTED ACYCLIC GRAPHS
val currentId = new AtomicInteger(0)
sealed trait Commit {
def id: Int
}
case class IndivCommit(parent: Commit) extends Commit {
lazy val id: Int = currentId.getAndIncrement()
}
case class MergeCommit(left: Commit, right: Commit) extends Commit {
lazy val id: Int = currentId.getAndIncrement()
}
case object FirstCommit extends Commit {
lazy val id: Int = currentId.getAndIncrement()
}
8/13/2019 Category Theory an Abstraction for Anything
5/31
8/13/2019 Category Theory an Abstraction for Anything
6/31
first
left right
GIT MERGE GRAPHval first = FirstCommit
val left = IndivCommit(first)
val right = IndivCommit(first)
8/13/2019 Category Theory an Abstraction for Anything
7/31
first
left right
merge
GIT MERGE GRAPHval first = FirstCommit
val left = IndivCommit(first)
val right = IndivCommit(first)
val merge = MergeCommit(left, right)
8/13/2019 Category Theory an Abstraction for Anything
8/31
first
left right
merge
CREATING A CATEGORY
1. A collection of objects
nodesThe in our graph of commits will be the objects.
8/13/2019 Category Theory an Abstraction for Anything
9/31
reachability
first
left right
merge
CREATING A CATEGORY
2. A set of morphisms or arrows between every two objects
Hom(first, left) = { }
Hom(merge, first) = { _MF }
Hom(left, left) = { _LL }
...
morphisms governed by
8/13/2019 Category Theory an Abstraction for Anything
10/31
first
left
merge
associativityidentity
CREATING A CATEGORY
3. A way to compose morphisms
(a) compositional holds(b) an morphism exists for each object
_ML * _LF = _MF
8/13/2019 Category Theory an Abstraction for Anything
11/31
A
C
G E
F
B
D
TERMINAL AND INITIAL OBJECTS
Object F is an initial object:For every object X, Hom(F, X) has size one
(i.e. F X for all X)
(i.e. all objects are reachable from F)
8/13/2019 Category Theory an Abstraction for Anything
12/31
A
B G
C D H
EF
TERMINAL AND INITIAL OBJECTS
Object A is a terminal object:For every object X, Hom(X, A) has size one
(i.e. X A for all X)
(i.e. all objects can reach to A)
8/13/2019 Category Theory an Abstraction for Anything
13/31
A
B
D E
C
TERMINAL AND INITIAL OBJECTS
Is a terminal or initial object guaranteed to exist in a
DAG?No!
8/13/2019 Category Theory an Abstraction for Anything
14/31
CATEGORY OF ALL THE GRAPHS
Objects: Graphs themselvesMorphisms: Structure-preserving graph homomorphisms
(i.e. adjacent nodes map to adjacent nodes)
8/13/2019 Category Theory an Abstraction for Anything
15/31
A
B
D
C
A B C D
FORGETFUL FUNCTOR
Functors are morphisms between categoriesForget:GRAPH-> SET
8/13/2019 Category Theory an Abstraction for Anything
16/31
OPTION FUNCTOR
Option[ _ ] is parametrized on a Scala type
Option[ _ ] gives us a way to convert from A to Option[A]
scala> def optionize[A](a: A): Option[A] = Some(a)
optionize: [A](a: A)Option[A]
Option[ _ ] is a Functor on the category of Scala types
What about the morphisms from one type to another?
8/13/2019 Category Theory an Abstraction for Anything
17/31
OPTION FUNCTOR
scala> def optionF[A, B](f: A => B)(optA: Option[A]): Option[B] = { | optA match { | case None => None | case Some(a) => Some(foo(a)) | } | }optionF: [A, B](f: A => B)(optA: Option[A])Option[B]
Option transforms morphisms and objects from the category
of Scala types to itself
8/13/2019 Category Theory an Abstraction for Anything
18/31
OPTION FUNCTORdef foo[A, B](a: A): B = { ... }
How can we transform Option[T] into List[T]?
8/13/2019 Category Theory an Abstraction for Anything
19/31
POLYMORPHIC FUNCTIONS
(parametric polymorphism)
def optToList[A](as: Option[A]): List[A] = { | as match { | case Some(a) => List[A](a) | case None => List.empty[A] | }
| }optToList: [A](as: Option[A])List[A]
scala> optToList[Int](Some(4))res4: List[Int] = List(4)
scala> optToList[String](Some("foobar"))res5: List[String] = List(foobar)
scala> optToList[Int](None)res7: List[Int] = List()
8/13/2019 Category Theory an Abstraction for Anything
20/31
commutes
NATURAL TRANSFORMATIONS
optToList[T] is a polymorphism and a Natural Transformation
This diagram
8/13/2019 Category Theory an Abstraction for Anything
21/31
every object
every morphism
NATURAL TRANSFORMATIONS
For Xwe have nat trans Option[X] ->
List[X]such that
for foo: X->Y
the diagram commutes
If we can define the same nat trans for every type
A,then this nat trans is a polymorphism!
8/13/2019 Category Theory an Abstraction for Anything
22/31
CURRYING
(aka schnfinkelzation)
def uncurried(x: Int, y: Int): Int = x + y
uncurried: (x: Int, y: Int)Int
scala> def curried(x: Int): Int => Int = (y: Int) => x + y
moreCurried: (x: Int)Int => Int
scala> uncurried(2, 3)
res5: Int = 9
scala> curried(2)(3)
res4: Int = 5
Currying provides another example
of a natural transformation
8/13/2019 Category Theory an Abstraction for Anything
23/31
object
HOM FUNCTORS
Hom(X, Y) is the set of morphisms from object X to object Y
Hom(_, Y) is a functorHom(_, B): SomeCategory => Set
Apply Hom(_, B) to an AHom(A, B)
morphismApply Hom(_, B) to a f: P -> QHom(Q, B) => Hom(P, B)
8/13/2019 Category Theory an Abstraction for Anything
24/31
X->Y, X->B
X->Y, Y->B
HOM FUNCTORS
Apply Hom(_, B) to a morphism f: X->Ydef f[X, Y](x: X): Y = { ... }
the "logical" (but wrong) ideaHom(X, B) => Hom(Y, B)
the correct idea: contravariance
Hom(Y, B) => Hom(X, B)
8/13/2019 Category Theory an Abstraction for Anything
25/31
COMIC INTERLUDE
8/13/2019 Category Theory an Abstraction for Anything
26/31
category
CURRYING
curry[A]: Hom(A x B, C) => Hom(A, Hom(B, C))
curry[_]: Hom(_ x B, C) => Hom(_, Hom(B, C))
A functor transforms one into another
Currying transforms one functor into another!
This sounds familiar...
8/13/2019 Category Theory an Abstraction for Anything
27/31
commutes
CURRYING
Can we create a diagram that ?
8/13/2019 Category Theory an Abstraction for Anything
28/31
CURRYING
For every object Qwe have nat trans Hom(QxB,C) -> Hom(Q,Hom(B,C))
such thatfor every morphism f: Y->Q
the diagram commutes
8/13/2019 Category Theory an Abstraction for Anything
29/31
CURRYING
Hom functor for type C instead
curry[C]: Hom(A x B, C) => Hom(A, Hom(B, C))
curry[_]: Hom(A x B, _) => Hom(A, Hom(B, _))
(google term: _ x B and Hom(B, _) are adjoint functors)
8/13/2019 Category Theory an Abstraction for Anything
30/31
CURRYING
(A x B) => Cdef uncurried(x: A, y: B): C = { ... }
A => (B => C)def curried(x: A): B => C = { ... }
isomorphismThere is a correspondence ( !) between the set offunctions (A x B) -> C and the set of functions A -> (B -> C)
8/13/2019 Category Theory an Abstraction for Anything
31/31
QUESTIONS?