1.8k

# ScalaMatsuri 2018 - A pragmatic introduction to Category Theory

Category Theory has become one of the hot topics in the community. Why is this theory suddenly so interesting for developers? Why are the cool kids talking so much about it?

This talk will introduce the general principles of Category Theory in a pragmatic, non-mathematical way. We will show practical examples of how this theory has managed to simplify and solve common challenges that we encounter in our code daily, such as nullable values, error handling, parallel and sequential operations and data validation. Also, we will apply them to create our own category theory library from scratch using ScalaCheck as the only dependency. March 17, 2018

## Transcript

1. A PRAGMATIC INTRODUCTION TO
CATEGORY THEORY
@DANIELASFREGOLA
SCALA MATSURI 2018
github.com/DanielaSfregola/tutorial-cat

2. AGENDA
- Intro
- Monoid
- Functor
- Applicative
github.com/DanielaSfregola/tutorial-cat

3. I AM NOT A MATHEMATICIAN

4. YOU DO NOT NEED TO KNOW
CATEGORY THEORY
TO WRITE
GOOD CODE

5. YOU DO NOT NEED TO KNOW
CATEGORY THEORY
TO WRITE
FUNCTIONAL CODE

6. CATEGORY THEORY
DEEPER UNDERSTANDING ON
OUR CODE

7. HOW DO WE
REASON ?

8. COMPOSITION
ABSTRACTION

9. CATEGORY THEORY
HOW THINGS COMPOSE

10. ARROW THEORY
CATEGORY THEORY
HOW THINGS COMPOSE

11. WHAT IS A CATEGORY?

12. COMPOSITION LAW

13. IDENTITY LAW

14. COMPOSITION + ASSOCIATIVITY

15. CATEGORY'S RULES
> Identity
> Composition
> Associativity

16. A PRACTICAL EXAMPLE

17. CATEGORY WITH 1 OBJECT

18. CATEGORY WITH 1
OBJECT
=
MONOID

19. MONOID'S RULES
Identity
n o id == id o n == n
Composition
forall x, y => x o y
Associativity
x o (y o z) == (x o y) o z

20. A PRACTICAL EXAMPLE

21. MONOID
trait Monoid[A] {
def identity: A
def compose(x: A, y: A): A
}

22. EXERCISES ON MONOID
> Define a monoid for Int
> Define a monoid for String
sbt 'testOnly *Monoid*'
github.com/DanielaSfregola/tutorial-cat

23. CATEGORY WITH 1+ OBJECT

24. CATEGORY IN A BOX

25. CATEGORY IN A BOX
> Objects are in a Box
> All the arrows are mapped

26. LIFTING: CONTEXT VS CONTENT

27. EXAMPLE OF BOXES
> Option
> Future
> Try
> List
> Either

28. CATEGORY IN A BOX
=
FUNCTOR

29. FUNCTOR'S RULES
Identity
map(id) == id
Composition
map(g o f) == map(g) o map(f)
Associativity
map(h o g) o map(f) == map(h) o map(g o f)

30. LIFTING: CONTEXT VS CONTENT

31. FUNCTOR
class Functor[Box[_]] {
def map[A, B](boxA: Box[A])
(f: A => B): Box[B]
}

32. EXERCISES ON FUNCTOR
> Define a functor for Maybe
> Define a functor for ZeroOrMore
sbt 'testOnly *Functor*'
github.com/DanielaSfregola/tutorial-cat

33. BOX FUNCTION + BOX VALUES

34. COMBINE MORE BOXES
=
APPLICATIVE

35. APPLICATIVE'S RULES
> Identity
> Associativity
> Homorphism
> Interchange
...and more!

36. COMBINE BOXES TOGETHER
> How to create a new box
> How to combine their values together

37. APPLICATIVE
class Applicative[Box[_]] extends Functor[Box] {
def pure[A](a: A): Box[A]
def ap[A, B](boxF: Box[A => B])(boxA: Box[A]): Box[B]
def map[A, B](boxA: Box[A])(f: A => B): Box[B] = ???
}

38. BOX FUNCTION + BOX VALUES

39. APPLICATIVE
class Applicative[Box[_]] extends Functor[Box] {
def pure[A](a: A): Box[A]
def ap[A, B](boxF: Box[A => B])(value: Box[A]): Box[B]
def ap2[A1, A2, B](boxF: Box[(A1, A2) => B])
(value1: Box[A1], value2: Box[A2]): Box[B]
// up to 22 values! // same for map
}

40. EXERCISES ON APPLICATIVE
> Define map in terms of ap and pure
> Define an applicative for Maybe
> Define an applicative for ZeroOrMore
sbt 'testOnly *Applicative*'
github.com/DanielaSfregola/tutorial-cat

41. BOX IN A BOX

42. BOX IN A BOX

43. FUSE TWO BOXES
=

> Identity
> Composition
> Associativity

def flatten[A](bb: Box[Box[A]]): Box[A]
def flatMap[A, B](valueA: Box[A])(f: A => Box[B]): Box[B] = {
val bb: Box[Box[B]] = map(valueA)(f)
bb.flatten
}
}

46. BOXES IN A SEQUENCE

47. FOR-COMPREHENSION
val boxA: Box[A]
def toBoxB: A => Box[B]
def toBoxC: B => Box[C]
def toBoxD: C => Box[D]
for { a b c d } yield d

def flatMap[A, B](boxA: Box[A])(f: A => Box[B]): Box[B]
// TODO - implement using flatMap
def flatten[A](boxBoxA: Box[Box[A]]): Box[A] = ???
// TODO - implement using flatMap and map
override def ap[A, B](boxF: Box[A => B])
(boxA: Box[A]): Box[B] = ???
// TODO - implement using flatMap and pure
override def map[A, B](boxA: Box[A])(f: A => B): Box[B] = ???
}

> Define flatten using flatMap
> Define map using flatMap and pure
> Define ap using flatMap and map
github.com/DanielaSfregola/tutorial-cat

> Define a monad for Maybe
> Define a monad for ZeroOrMore
github.com/DanielaSfregola/tutorial-cat

51. FUNCTOR VS ENDOFUNCTOR

A MONOID
IN THE CATEGORY OF
ENDOFUNCTORS

MONOID => pure + flatten
ENDOFUNCTORS => map

54. SUMMARY
CATEGORY THEORY >> how things compose
MONOID >> combining 2 values into 1
FUNCTOR >> values lifted to a context
APPLICATIVE >> independent values applied
to a function in a context
MONAD >> ops in sequence in a context

FOCUS ON
HOW THINGS
COMPOSE

56. WANNA KNOW MORE?
> Category Theory for the WH by