Daniela Sfregola
March 17, 2018
2.2k

# 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

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

FUNCTIONAL CODE

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

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

25. ### CATEGORY IN A BOX > Objects are in a Box

> All the arrows are mapped

27. ### EXAMPLE OF BOXES > Option > Future > Try >

List > Either

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)

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

...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] = ??? // spoiler alert }

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

45. ### MONAD (AS FUNCTOR) class Monad[Box[_]] extends Functor[Box] { 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 } }

47. ### FOR-COMPREHENSION val boxA: Box[A] def toBoxB: A => Box[B] def

toBoxC: B => Box[C] def toBoxD: C => Box[D] for { a <- boxA b <- toBoxB(a) c <- toBoxC(b) d <- toBoxD(c) } yield d
48. ### MONAD (AS APPLICATIVE) trait Monad[Box[_]] extends Applicative[Box] { 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] = ??? }
49. ### EXERCISES ON MONAD (1) > Define flatten using flatMap >

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

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

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

@PhilipWadler > Category Theory by @BartoszMilewski > Cats-Infographics by Rob Norris - @tpolecat > Cats Documentation - Type Classes