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

Category theory for beginners

  • Upload
    kenbot

  • View
    36.720

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Category theory for beginners

Category Theory for

beginnersMelbourne Scala User Group Feb 2015

@KenScambler

A B

C

Page 2: Category theory for beginners

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

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

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

I. Categories

Page 6: Category theory for beginners

Category

Objects

Page 7: Category theory for beginners

Category

Objects

Arrows or

morphisms

Page 8: Category theory for beginners

Category

Objects

Arrows

Domain f

dom(f)

Page 9: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain f

cod(f)

dom(f)

Page 10: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

dom(g)

cod(g)

g

Page 11: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Page 12: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

f

Page 13: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

fg

Page 14: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

fg

g ∘ f

Page 15: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

f

Page 16: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

f

h

Page 17: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

f

h

h ∘ f

Page 18: Category theory for beginners

Category

Objects

Arrows

Domain/Codomain

Composition

Identity

Page 19: Category theory for beginners

Category

Compose

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

C)

Identity

id : A A

Page 20: Category theory for beginners

Category Laws

Associative Law

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

Identity Laws

f ∘ id = id ∘ f = f

Page 21: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 22: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 23: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 24: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 25: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 26: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 27: Category theory for beginners

Associative law

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

f

g

h

(g ∘ h)

(f ∘ g)

Page 28: Category theory for beginners

Identity laws

f ∘ id = id ∘ f = f

fid id

Page 29: Category theory for beginners

Identity laws

f ∘ id = id ∘ f = f

fid id

Page 30: Category theory for beginners

Identity laws

f ∘ id = id ∘ f = f

fid id

Page 31: Category theory for beginners

Identity laws

f ∘ id = id ∘ f = f

fid id

Page 32: Category theory for beginners

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

Sets & functions

Person

String Integer

bestFriend

length

name age

+1

Page 34: Category theory for beginners

Sets & functions

Infinite arrows from composition

+1∘ length ∘ name

bestFriend ∘ bestFriend

bestFriend ∘ bestFriend ∘ bestFriend

+1∘ age∘ bestFriend

Page 35: Category theory for beginners

Sets & functions

Objects

Arrows

Composition

Identity

Page 36: Category theory for beginners

Sets & functions

Objects = sets (or types)

Arrows = functions

Composition = function composition

Identity = identity function

Page 37: Category theory for beginners

Zero

Page 38: Category theory for beginners

One

Page 39: Category theory for beginners

Two

Page 40: Category theory for beginners

Three

Page 41: Category theory for beginners

Class hierarchy

IFruit

IBanana

AbstractBanana

BananaImpl MockBanana

Tool

Spanner

Page 42: Category theory for beginners

Class hierarchy

Objects

Arrows

Composition

Identity

Page 43: Category theory for beginners

Class hierarchy

Objects = classes

Arrows = “extends”

Composition = “extends” is transitive

Identity = trivial

Page 44: Category theory for beginners

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

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

World Wide Web

Objects = webpages

Arrows = hyperlinks

Composition = Links don’t compose

Identity

Page 47: Category theory for beginners

World Wide Web

Graphs

Objects = nodes

Arrows = edges

Composition = Edges don’t compose

Identity

Page 48: Category theory for beginners

“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

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

Category of Types & Functions

object FnCatextends 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

Category of Garden Hoses

sealed trait Hose[In, Out] {def leaks: Intdef 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

Category of Garden Hoses

[live code example]

Page 53: Category theory for beginners

Categories embody the

principle of

strongly-typed

composability

Page 54: Category theory for beginners

II. Functors

Page 55: Category theory for beginners

Functors

Functors map between categories

Objects objects

Arrows arrows

Preserves composition & identity

Page 56: Category theory for beginners

Functor laws

Composition Law

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

Identity Law

F(idA) = idF(A)

Page 57: Category theory for beginners

CF

DCategory Category

Functor

Page 58: Category theory for beginners

CF

DCategory Category

Functor

CatCategory of categories

Page 59: Category theory for beginners

CF

DCategory Category

Functor

CatCategory of categories

Objects = categories

Arrows = functors

Composition = functor composition

Identity = Identity functor

Page 60: Category theory for beginners

CF

D

A

B

C

g ∘ f

f

g

Page 61: Category theory for beginners

CF

D

A

B

C

g ∘ f

f

g

F(A)

Page 62: Category theory for beginners

CF

D

A

B

C

g ∘ f

f

g

F(A)

F(B)

Page 63: Category theory for beginners

CF

D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

Page 64: Category theory for beginners

CF

D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

F(f)

Page 65: Category theory for beginners

CF

D

A

B

C

g ∘ f

f

g

F(A)

F(B)

F(C)

F(f)

F(g

)

Page 66: Category theory for beginners

CF

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

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 68: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 69: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 70: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 71: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 72: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 73: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 74: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

F(g ∘ f)

Composition Law

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

Page 75: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

Composition Law

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

F(g) ∘ F(f)

Page 76: Category theory for beginners

g ∘ f

f

g

F(f)

F(g

)

Composition Law

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

F(g) ∘ F(f)

F(g ∘ f)

Page 77: Category theory for beginners

Identity law

F(idA)= idF(A)

A

Page 78: Category theory for beginners

Identity law

F(idA)= idF(A)

A

idA

Page 79: Category theory for beginners

Identity law

F(idA)= idF(A)

A

idAF(idA)

Page 80: Category theory for beginners

Identity law

F(idA)= idF(A)

A

Page 81: Category theory for beginners

Identity law

F(idA)= idF(A)

AF(A)

Page 82: Category theory for beginners

Identity law

F(idA)= idF(A)

AF(A)

idF(A)

Page 83: Category theory for beginners

Identity law

F(idA)= idF(A)

AF(A)

idF(A)

A

idA

F(idA)

Page 84: Category theory for beginners

Terminology

homomorphism

Page 85: Category theory for beginners

Terminology

homomorphism

Same

Page 86: Category theory for beginners

Terminology

homomorphism

Same-shape-ism

Page 87: Category theory for beginners

Terminology

homomorphism

“structure preserving map”

Page 88: Category theory for beginners

Terminology

homomorphism

Functors are

“category homomorphisms”

Page 89: Category theory for beginners

Functors in code

trait Functor[F[_]] {

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

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

}

Page 90: Category theory for beginners

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

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

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

Functors laws in code

fa.map(f).map(g)

==

fa.map(g compose f)

Page 94: Category theory for beginners

Functors laws in code

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

Page 95: Category theory for beginners

Terminology

endomorphism

Page 96: Category theory for beginners

Terminology

endomorphism

Within

Page 97: Category theory for beginners

Terminology

endomorphism

Within -shape-ism

Page 98: Category theory for beginners

Terminology

endomorphism

“a mapping from

something back to itself”

Page 99: Category theory for beginners

Terminology

endo

“a mapping from

something back to itself”

Page 100: Category theory for beginners

Endofunctors

In Scala, all our functors

are

actually endofunctors.

TypeF

Category Category

EndofunctorType

Page 101: Category theory for beginners

Endofunctors

Luckily, we can represent

any functor in our type

system as some F[_]

TypeF

Category Category

EndofunctorType

Page 102: Category theory for beginners

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

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

List Functor

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

Page 105: Category theory for beginners

List Functor

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

Page 106: Category theory for beginners

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

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

III. Monoids

Page 109: Category theory for beginners

Monoids

Some set we’ll call M

Compose

• : M × M M

Identity

id : M

Page 110: Category theory for beginners

Monoid Laws

Associative Law

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

Identity Laws

f • id = id • f = f

Page 111: Category theory for beginners

Category Laws

Associative Law

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

Identity Laws

f ∘ id = id ∘ f = f

Page 112: Category theory for beginners

Monoids

Compose

• : M × M M

Identity

id : M

Page 113: Category theory for beginners

Category

Compose

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

C)

Identity

id : A A

Page 114: Category theory for beginners

Category with 1 object

Compose

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

A)

Identity

id : A A

Page 115: Category theory for beginners

Category with 1 object

Compose

∘ : M M M

Identity

id : M

Page 116: Category theory for beginners

Monoids are categories

Each arrow is an element

in the monoid

Only one object

Page 117: Category theory for beginners

Monoids are categories

Objects = placeholder singleton

Arrows = elements of the monoid

Composition = •

Identity = id

Only one object

Each arrow is an element

in the monoid

Page 118: Category theory for beginners

MH

N

Monoid Monoid

Monoid homomorphism

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

Page 119: Category theory for beginners

MH

N

Monoid Monoid

Monoid homomorphism

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

MonCategory of monoids

Page 120: Category theory for beginners

MH

N

Monoid Monoid

Monoid homomorphism

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

MonCategory of monoids

Objects = monoids

Arrows = monoid homomorphisms

Composition = function composition

Identity = Identity function

Page 121: Category theory for beginners

MH

N

SM

SN

“structure-preserving map”

Set Setfunction

hSets

Where h preserves composition &

identity

Page 122: Category theory for beginners

Example

String length is a monoid

homomorphism from

(String, +, "") to

(Int, +, 0)

Page 123: Category theory for beginners

Preserves identity

Preserves composition

"".length == 0

(str1 + str2).length =

str1.length + str2.length

Page 124: Category theory for beginners

Monoids in code

trait Monoid[M] {

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

def id: M

}

Page 125: Category theory for beginners

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

Int / 0 / +

import IntAddMonoid._

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

21

Page 127: Category theory for beginners

Int / 1 / *

import IntMultMonoid._

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

720

Page 128: Category theory for beginners

String / "" / +

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

”aleaiactaest"

Page 129: Category theory for beginners

Endos / id / ∘

def mash: Potato => Potato

def addOne: Int => Int

def flipHorizontal: Shape => Shape

def bestFriend: Person => Person

Page 130: Category theory for beginners

A=>A / a=>a / compose

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

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

Page 131: Category theory for beginners

Are chairs monoids?

Page 132: Category theory for beginners

Chair

Composition =

You can’t turn two chairs into one

Identity =

Page 133: Category theory for beginners

Chair stack

Page 134: Category theory for beginners

Chair stack

Composition = stack them on top

Identity = no chairs

Page 135: Category theory for beginners

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

…almost

Real monoids don’t topple;

they keep scaling

Page 137: Category theory for beginners

Monoids embody the

principle of

weakly-typed

composability

Page 138: Category theory for beginners

IV. Products & sums

Page 139: Category theory for beginners

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

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

Algebraic Data Types

A × List[A] + 1A + 1

A + 14

Street × Suburb × Postcode × State

Page 142: Category theory for beginners

Algebraic Data Types

A × List[A] + 1A + 1

A + 14

Street × Suburb × Postcode × State

isomorphic

Page 143: Category theory for beginners

Terminology

isomorphism

Page 144: Category theory for beginners

Terminology

isomorphism

Equal

Page 145: Category theory for beginners

Terminology

isomorphism

Equal-shape-ism

Page 146: Category theory for beginners

Terminology

isomorphism

“Sorta kinda the same-ish”

but I want to sound really

smart- Programmers

Page 147: Category theory for beginners

Terminology

isomorphism

“Sorta kinda the same-ish”

but I want to sound really

smart- Programmers

Page 148: Category theory for beginners

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

Isomorphism

objectobject

arrows

Page 150: Category theory for beginners

Isomorphism

Same as

identity

Page 151: Category theory for beginners

Isomorphism

Same as

identity

Page 152: Category theory for beginners

These 4

Shapes

Wiggles

Setfunctions

Set

Page 153: Category theory for beginners

These 4

Shapes

Wiggles

Page 154: Category theory for beginners

These 4

Shapes

Wiggles

Page 155: Category theory for beginners

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

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

Sums

A + BA Bleft right

Given an A, or a B, we have

the sum A-or-B

Page 158: Category theory for beginners

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

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

A

A×B

B

A product in C is a sum in Cop

A sum in C is a product in Cop

A+B

B

A

C Cop

Page 161: Category theory for beginners

Sums ≅ Products!

Page 162: Category theory for beginners

Terminology

dual

An object and its equivalent in the

opposite category are

to each other.

Page 163: Category theory for beginners

Terminology

Co-(thing)

Often we call something’s dual a

Page 164: Category theory for beginners

Terminology

Coproducts

Sums are also called

Page 165: Category theory for beginners

V. Composable

systems

Page 166: Category theory for beginners

Growing a system

Banana

Page 167: Category theory for beginners

Growing a system

Page 168: Category theory for beginners

Growing a system

Page 169: Category theory for beginners

Growing a system

Bunch

Page 170: Category theory for beginners

Growing a system

BunchBunch

Page 171: Category theory for beginners

Growing a system

BunchBunch

Bunch

Page 172: Category theory for beginners

Growing a system

BunchBunch

Bunch

BunchManager

Page 173: Category theory for beginners

Growing a system

BunchBunch

Bunch

BunchManager

AnyManagers

Page 174: Category theory for beginners
Page 175: Category theory for beginners
Page 176: Category theory for beginners
Page 177: Category theory for beginners

compose

Page 178: Category theory for beginners
Page 179: Category theory for beginners

compose

Page 180: Category theory for beginners

etc…

Page 181: Category theory for beginners

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

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

VI. Abstraction

Page 184: Category theory for beginners

Spanner

Page 185: Category theory for beginners

Spanner

AbstractSpanner

Page 186: Category theory for beginners

Spanner

AbstractSpanner

AbstractToolThing

Page 187: Category theory for beginners

Spanner

AbstractSpanner

AbstractToolThing

GenerallyUsefulThing

Page 188: Category theory for beginners

Spanner

AbstractSpanner

AbstractToolThing

GenerallyUsefulThing

AbstractGenerallyUsefulThingFactory

Page 189: Category theory for beginners

Spanner

AbstractSpanner

AbstractToolThing

GenerallyUsefulThing

AbstractGenerallyUsefulThingFactory

WhateverFactoryBuilder

Page 190: Category theory for beginners
Page 191: Category theory for beginners

That’s not what

abstraction

means.

Page 192: Category theory for beginners

Code shouldn’t know

things that aren’t

needed.

Page 193: Category theory for beginners

def getNames(users: List[User]): List[Name] = {

users.map(_.name)}

Page 194: Category theory for beginners

def getNames(users: List[User]): List[Name] = {

println(users.length) users.map(_.name)

}

Over time…

Page 195: Category theory for beginners

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

“Oh, now we need

the roster of names!

A simple list won’t

do.”

Page 197: Category theory for beginners

def getRosterNames(users: Roster[User]): Roster[Name] = {

users.map(_.name)}

Page 198: Category theory for beginners

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

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

When code knows too much,

soon new things will appear

that actually require the other

stuff.

Page 201: Category theory for beginners

Coupling has

increased. The mixed

concerns will tangle

and snarl.

Page 202: Category theory for beginners

Code is rewritten each time for

trivially different requirements

Page 203: Category theory for beginners

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

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

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

We’ve seen deep

underlying patterns

beneath superficially

different things

A×B A+B

Page 207: Category theory for beginners

Just about everything

ended up being in a

category, or being one.

Page 208: Category theory for beginners

There is no better

way to understand

the patterns

underlying software

than studying

Category Theory.

Page 209: Category theory for beginners

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