Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

209
Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C

Transcript of Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Page 1: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category Theory for beginners

Melbourne Scala User Group Feb 2015@KenScambler

A B

C

Page 2: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Abstract maths… for us?

Dizzyingly abstract branch of maths

“Abstract nonsense”?

Programming = maths

Programming = abstraction

Really useful to programming!

Page 3: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

The plan

Basic Category Theory concepts

New vocabulary (helpful for further reading)

How it relates to programming

Category Theory as seen by maths versus FP

Page 4: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

A bit of background

1940s Eilenberg, Mac Lane invent Category Theory

1958 Monads discovered by Godement

In programming:1990 Moggi, Wadler apply monads to programming

2006 “Applicative Programming with Effects” McBride & Paterson

2006 “Essence of the Iterator Pattern” Gibbons & Oliveira

Page 5: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

I. Categories

Page 6: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Page 7: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows or morphisms

Page 8: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain f

dom(f)

Page 9: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

f

cod(f)

dom(f)

Page 10: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

dom(g)

cod(g)

g

Page 11: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Page 12: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

f

Page 13: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

fg

Page 14: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

fg

g ∘ f

Page 15: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

f

Page 16: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

f

h

Page 17: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

f

h

h ∘ f

Page 18: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Objects

Arrows

Domain/Codomain

Composition

Identity

Page 19: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Compose

∘ : (B C) (A B) (A C)Identity

id : A A

Page 20: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category Laws

Associative Law

(f ∘ g) ∘ h = f ∘ (g ∘ h )

Identity Laws

f ∘ id = id ∘ f = f

Page 21: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 22: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 23: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 24: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 25: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 26: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 27: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Associative law(f ∘ g) ∘ h = f ∘ (g ∘ h )

f

g

h

(g ∘ h)

(f ∘ g)

Page 28: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawsf ∘ id = id ∘ f = f

fid id

Page 29: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawsf ∘ id = id ∘ f = f

fid id

Page 30: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawsf ∘ id = id ∘ f = f

fid id

Page 31: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawsf ∘ id = id ∘ f = f

fid id

Page 32: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Examples

Infinite categories

Finite categories

Objects can represent anything

Arrows can represent anything

As long as we have composition and identity!

Page 33: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Sets & functions

Person

String Integer

bestFriend

length

name age+1

Page 34: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Sets & functions

Infinite arrows from composition

+1∘ length ∘ name

bestFriend ∘ bestFriend

bestFriend ∘ bestFriend ∘ bestFriend

+1∘ age∘ bestFriend

Page 35: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Sets & functions

Objects

Arrows

Composition

Identity

Page 36: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Sets & functions

Objects = sets (or types)

Arrows = functions

Composition = function composition

Identity = identity function

Page 37: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Zero

Page 38: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

One

Page 39: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Two

Page 40: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Three

Page 41: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Class hierarchy

IFruit

IBanana

AbstractBanana

BananaImpl MockBanana

Tool

Spanner

Page 42: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Class hierarchy

Objects

Arrows

Composition

Identity

Page 43: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Class hierarchy

Objects = classes

Arrows = “extends”

Composition = “extends” is transitive

Identity = trivial

Page 44: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Class hierarchy Partially ordered sets (posets)

Objects = elements in the set

Arrows = ordering relation ≤

Composition = ≤ is transitive

Identity = trivial

Page 45: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

World Wide Webwww.naaawcats.com

No dogs allowed!

www.robodogs.com

See here for more robots

www.coolrobots.com

BUY NOW!!!!

Page 46: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

World Wide Web

Objects = webpages

Arrows = hyperlinks

Composition = Links don’t compose

Identity

Page 47: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

World Wide Web Graphs

Objects = nodes

Arrows = edges

Composition = Edges don’t compose

Identity

Page 48: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

“Free Category” from graphs!

Objects = nodes

Arrows = paths (0 to many edges)

Composition = aligning paths end to end

Identity = you’re already there

Page 49: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Categories in code

trait Category[Arrow[_,_]] {

def compose[A,B,C]( c: Arrow[B,C], d: Arrow[A,B]): Arrow[A,C]

def id[A]: Arrow[A,A]

}

Page 50: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category of Types & Functions

object FnCat extends Category[Function1] {

def compose[A,B,C]( c: B => C, d: A => B): A => C = {

a => c(d(a)) }

def id[A]: A => A = (a => a)}

Page 51: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category of Garden Hoses

sealed trait Hose[In, Out] { def leaks: Int def kinked: Boolean

def >>[A](in: Hose[A, In]): Hose[A, Out] def <<[A](out: Hose[Out, A]): Hose[In, A]

}

Page 52: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category of Garden Hoses

[live code example]

Page 53: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Categories embody the principle of strongly-typed composability

Page 54: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

II. Functors

Page 55: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors

Functors map between categories

Objects objects

Arrows arrows

Preserves composition & identity

Page 56: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functor laws

Composition Law

F(g ∘ f) = F(g) ∘ F(f)Identity Law

F(idA) = idF(A)

Page 57: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F DCategory Category

Functor

Page 58: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F DCategory Category

Functor

CatCategory of categories

Page 59: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F DCategory Category

Functor

CatCategory of categories

Objects = categoriesArrows = functorsComposition = functor compositionIdentity = Identity functor

Page 60: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

Page 61: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

F(A)

Page 62: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

F(A)

F(B)

Page 63: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

Page 64: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

F(f)

Page 65: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

F(f)

F(g)

Page 66: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

C F D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

F(f)

F(g)

F(g ∘ f)

Page 67: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 68: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 69: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 70: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 71: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 72: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 73: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 74: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

F(g ∘ f)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

Page 75: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

F(g) ∘ F(f)

Page 76: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

g ∘ f

f

g

F(f)

F(g)

Composition LawF(g ∘ f) = F(g) ∘ F(f)

F(g) ∘ F(f)F(g ∘ f)

Page 77: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A

Page 78: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A

idA

Page 79: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A

idAF(idA)

Page 80: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A

Page 81: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A F(A)

Page 82: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A F(A)

idF(A)

Page 83: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Identity lawF(idA)= idF(A)

A F(A)

idF(A)

A

idA

F(idA)

Page 84: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

homomorphism

Page 85: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

homomorphismSame

Page 86: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

homomorphismSame-shape-

ism

Page 87: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

homomorphism“structure preserving map”

Page 88: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

homomorphismFunctors are

“category homomorphisms”

Page 89: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors in code

trait Functor[F[_]] {

def map[A,B](fa: F[A],

f: A => B): F[B]

}

Page 90: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors in code

trait Functor[F[_]] {

def map[A,B](fa: F[A],

f: A => B): F[B]

}

Objects to objects

Page 91: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors in code

trait Functor[F[_]] {

def map[A,B](fa: F[A],

f: A => B): F[B]

}

Arrows to arrows

Page 92: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors in code

trait Functor[F[_]] {

def map[A,B]: (A => B) => (F[A] => F[B])

}

Arrows to arrows

Page 93: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors laws in code

fa.map(f).map(g)

==

fa.map(g compose f)

Page 94: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors laws in code

fa.map(a => a) == fa

Page 95: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

endomorphism

Page 96: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

endomorphismWithi

n

Page 97: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

endomorphismWithi

n-shape-ism

Page 98: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

endomorphism

“a mapping from something back to itself”

Page 99: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

endo

“a mapping from something back to itself”

Page 100: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Endofunctors

In Scala, all our functors are actually endofunctors.

Type

F

Category Category

Endofunctor Type

Page 101: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Endofunctors

Luckily, we can represent any functor in our type system as some F[_]

Type

F

Category Category

EndofunctorType

Page 102: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

List Functor

sealed trait List[+A]

case class Cons(head: A, tail: List[A]) extends List[A]

case object Nil extends List[Nothing]

Page 103: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

List Functor

sealed trait List[+A] {

def map[B](f: A => B): List[B] = this match { case Cons(h,t) => Cons(f(h), t map f) case Nil => Nil } }}

Page 104: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

List Functor

potatoList .map(mashEm) .map(boilEm) .map(stickEmInAStew)

Page 105: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

List Functor

userList .map(_.name) .map(_.length) .map(_ + 1) .map(_.toString)

Page 106: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Other functors

trait Tree[A]

trait Future[A]

trait Process[A]

trait Command[A]

X => A

(X, A)

trait Option[A]

Page 107: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Functors

Fundamental concept in Category Theory

Super useful

Everywhere

Staple of functional programming

Write code that’s ignorant of unnecessary context

Page 108: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

III. Monoids

Page 109: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids

Some set we’ll call MCompose

• : M × M M

Identity

id : M

Page 110: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoid Laws

Associative Law

(f • g) • h = f • (g • h )

Identity Laws

f • id = id • f = f

Page 111: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category Laws

Associative Law

(f ∘ g) ∘ h = f ∘ (g ∘ h )

Identity Laws

f ∘ id = id ∘ f = f

Page 112: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids

Compose

• : M × M M

Identity

id : M

Page 113: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category

Compose

∘ : (B C) (A B) (A C)Identity

id : A A

Page 114: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category with 1 object

Compose

∘ : (A A) (A A) (A A)Identity

id : A A

Page 115: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Category with 1 object

Compose

∘ : M M MIdentity

id : M

Page 116: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids are categories

Each arrow is an element in the monoid

Only one object

Page 117: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids are categories

Objects = placeholder singletonArrows = elements of the monoidComposition = •Identity = id

Only one object

Each arrow is an element in the monoid

Page 118: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

M H NMonoid Monoid

Monoid homomorphism

(SM, •M, idM) (SN, •N, idN)

Page 119: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

M H NMonoid Monoid

Monoid homomorphism

(SM, •M, idM) (SN, •N, idN)

MonCategory of monoids

Page 120: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

M H NMonoid Monoid

Monoid homomorphism

(SM, •M, idM) (SN, •N, idN)

MonCategory of monoids

Objects = monoidsArrows = monoid homomorphismsComposition = function compositionIdentity = Identity function

Page 121: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

M H N

SM SN

“structure-preserving map”

Set Setfunction

hSets

Where h preserves composition & identity

Page 122: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Example

String length is a monoid homomorphism from (String, +, "") to (Int, +, 0)

Page 123: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Preserves identity

Preserves composition

"".length == 0

(str1 + str2).length = str1.length + str2.length

Page 124: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids in code

trait Monoid[M] {

def compose(a: M, b: M): M

def id: M

}

Page 125: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids in code

def foldMonoid[M: Monoid]( ms: Seq[M]): M = {

ms.foldLeft(Monoid[M].id) (Monoid[M].compose)

}

Page 126: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Int / 0 / +

import IntAddMonoid._

foldMonoid[Int](Seq( 1,2,3,4,5,6))

21

Page 127: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Int / 1 / *

import IntMultMonoid._

foldMonoid[Int](Seq( 1,2,3,4,5,6))

720

Page 128: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

String / "" / +

foldMonoid[String](Seq( "alea", "iacta", "est"))

”aleaiactaest"

Page 129: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Endos / id / ∘

def mash: Potato => Potato

def addOne: Int => Int

def flipHorizontal: Shape => Shape

def bestFriend: Person => Person

Page 130: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

A=>A / a=>a / compose

foldMonoid[Int => Int](Seq( _ + 12, _ * 2, _ - 3))

(n: Int) => ((n + 12) * 2) - 3

Page 131: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Are chairs monoids?

Page 132: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Chair

Composition = You can’t turn two chairs into one

Identity =

Page 133: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Chair stack

Page 134: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Chair stack

Composition = stack them on top Identity = no chairs

Page 135: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Chair Stack is the free monoid of chairs

Protip: just take 0-to-many of anything, and you get a monoid for free

Page 136: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

…almost

Real monoids don’t topple; they keep scaling

Page 137: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Monoids embody the principle of weakly-typed composability

Page 138: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

IV. Products & sums

Page 139: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Algebraic Data TypesList[A] - Cons(A, List[A]) - Nil

Option[A] - Some(A) - None

BusinessResult[A] - OK(A) - Error

Wiggles - YellowWiggle - BlueWiggle - RedWiggle - PurpleWiggle

Address(Street, Suburb, Postcode, State)

Page 140: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Algebraic Data Types

Cons(A × List[A]) + Nil

Some(A) + None

OK(A) + Error

YellowWiggle + BlueWiggle + RedWiggle + PurpleWiggle

Street × Suburb × Postcode × State

Page 141: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Algebraic Data Types

A × List[A] + 1 A + 1

A + 14

Street × Suburb × Postcode × State

Page 142: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Algebraic Data Types

A × List[A] + 1 A + 1

A + 14

Street × Suburb × Postcode × State

isomorphic

Page 143: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

isomorphism

Page 144: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

isomorphismEqual

Page 145: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

isomorphismEqual-shape-

ism

Page 146: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

isomorphism

“Sorta kinda the same-ish” but I want to sound really smart

- Programmers

Page 147: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

isomorphism

“Sorta kinda the same-ish” but I want to sound really smart

- Programmers

Page 148: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

isomorphism

One-to-one mapping between two objects so you can go back-and-forth without losing information

Page 149: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Isomorphism

objectobject

arrows

Page 150: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Isomorphism

Same as identity

Page 151: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Isomorphism

Same as identity

Page 152: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

These 4 Shapes

Wiggles

Setfunctions

Set

Page 153: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

These 4 Shapes

Wiggles

Page 154: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

These 4 Shapes

Wiggles

Page 155: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

There can be lots of isos between two objects!

If there’s at least one, we can say they are isomorphic

or A ≅ B

Page 156: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Products

A × BA Bfirst seco

nd

Given the product of A-and-B, we can obtain both A and B

Page 157: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Sums

A + BA Bleft right

Given an A, or a B, we have the sum A-or-B

Page 158: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Opposite categories

C Cop

A

B

C

g ∘ f

f

g

A

B

C

fop ∘ gop

fop

gop

Isomorphic!

Page 159: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

A

B

C

g ∘ f

f

g

A

B

C

f ∘ g

f

g

Just flip the arrows, and reverse composition!

Page 160: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

A

A×B

B

A product in C is a sum in CopA sum in C is a product in Cop

A+B

B

A

C Cop

Page 161: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Sums ≅ Products!

Page 162: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

dual

An object and its equivalent in the opposite category are

to each other.

Page 163: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

Co-(thing)

Often we call something’s dual a

Page 164: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Terminology

Coproducts

Sums are also called

Page 165: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

V. Composable systems

Page 166: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

Banana

Page 167: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

Page 168: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

Page 169: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

Bunch

Page 170: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

BunchBunch

Page 171: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

BunchBunch

Bunch

Page 172: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

BunchBunch

Bunch

BunchManager

Page 173: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Growing a system

BunchBunch

Bunch

BunchManager

AnyManagers

Page 174: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.
Page 175: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.
Page 176: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.
Page 177: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

compose

Page 178: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.
Page 179: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

compose

Page 180: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

etc…

Page 181: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Using composable abstractions means your code can grow without getting more complex

Categories and Monoids capture the essence of composition in software!

Page 182: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Look for Monoids and Categories in your domain where you can

You can even bludgeon non-composable things into free monoids and free categories

Page 183: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

VI. Abstraction

Page 184: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Spanner

Page 185: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Spanner

AbstractSpanner

Page 186: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Spanner

AbstractSpanner

AbstractToolThing

Page 187: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Spanner

AbstractSpanner

AbstractToolThing

GenerallyUsefulThing

Page 188: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Spanner

AbstractSpanner

AbstractToolThing

GenerallyUsefulThing

AbstractGenerallyUsefulThingFactory

Page 189: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Spanner

AbstractSpanner

AbstractToolThing

GenerallyUsefulThing

AbstractGenerallyUsefulThingFactory

WhateverFactoryBuilder

Page 190: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.
Page 191: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

That’s not what abstraction means.

Page 192: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Code shouldn’t know things that aren’t needed.

Page 193: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getNames(users: List[User]): List[Name] = { users.map(_.name)}

Page 194: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getNames(users: List[User]): List[Name] = { println(users.length) users.map(_.name)}

Over time…

Page 195: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getNames(users: List[User]): List[Name] = { println(users.length) if (users.length == 1) { s”${users.head.name} the one and only"

} else { users.map(_.name) }}

Page 196: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

“Oh, now we need the roster of names! A simple list won’t do.”

Page 197: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getRosterNames(users: Roster[User]): Roster[Name] = { users.map(_.name)}

Page 198: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getRosterNames(users: Roster[User]): Roster[Name] = { LogFactory.getLogger.info(s”When you party with ${users.rosterTitle}, you must party hard!") users.map(_.name)}

Over time…

Page 199: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getRosterNames(users: Roster[User]): Roster[Name] = { LogFactory.getLogger.info(s"When you party with ${users.rosterTitle}, you must party hard!") if (users.isFull) EmptyRoster("(everyone) ") else users.map(_.name)}

Page 200: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

When code knows too much, soon new things will appear that actually require the other stuff.

Page 201: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Coupling has increased. The mixed concerns will tangle and snarl.

Page 202: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Code is rewritten each time for trivially different requirements

Page 203: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

def getNames[F: Functor](users: F[User]): F[Name] = { Functor[F].map(users)(_.name)}

getNames(List(alice, bob, carol))

getNames(Roster(alice, bob, carol))

Page 204: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Not only is the abstract code not weighed down with useless junk, it can’t be!

Reusable out of the box!

Page 205: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Abstraction is about hiding unnecessary information. This a good thing.We actually know more about what the

code does, because we have stronger guarantees!

Page 206: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

We’ve seen deep underlying patterns beneath superficially different things

A×B A+B

Page 207: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Just about everything ended up being in a category, or being one.

Page 208: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

There is no better way to understand the patterns underlying software than studying Category Theory.

Page 209: Category Theory for beginners Melbourne Scala User Group Feb 2015 @KenScambler A B C.

Further readingAwodey, “Category Theory”

Lawvere & Schanuel, “Conceptual Mathematics: an introduction to categories”

Jeremy Kun, “Math ∩ Programming” at http://jeremykun.com/

Gabriel Gonzalez “Haskell for all”http://www.haskellforall.com/2012/08/the-category-design-pattern.html

http://www.haskellforall.com/2014/04/scalable-program-architectures.html