Lars Hupel
October 24, 2014
800

OptimusPrimeT

Everybody knows monads by now, so a talk about monads would hardly be worthwhile. Let's take it to the next level: monad transformers. We'll learn what they are, how they naturally emerge in your code base and how to make good use of them in Scala – and maybe even how to create your own.

October 24, 2014

Transcript

2. None
3. None
4. (A ⊗ B) ⊗ TC αA,B,TC  tA⊗B,C // T((A

⊗ B) ⊗ C) T(αA,B,C )  A ⊗ (B ⊗ TC) A⊗tB,C // A ⊗ T(B ⊗ C) tA,B⊗C // T(A ⊗ (B ⊗ C))
5. None
6. None
7. Agenda 1 Functors, Applica ves, Monads 2 Composi on of

more. 8

of use cases: ▶ error handling ▶ parser combinators ▶ value-oriented parallelism ▶ ... 9

cal and prac cal limita ons 10

12. Functors from the ground up Functors are about transforming data

scala> List(1, 2, 3).map(x => x + 1) List(2, 3, 4) scala> Some(1).map(x => x + 1) Some(2) scala> Future { 1 }.map(x => x + 1) // something resembling 2 12
13. Functors from the ground up Functors are about transforming data

scala> List(1, 2, 3).map(x => x + 1) List(2, 3, 4) scala> Some(1).map(x => x + 1) Some(2) scala> Future { 1 }.map(x => x + 1) // something resembling 2 12
14. The Functor class scalaz oﬀers a generaliza on of that

pa ern trait Functor[F[_]] { def map[A, B](f: A => B, fa: F[A]): F[B] } 13
15. More power: Applica ves Applica ves are about transforming independent

pieces of data scala> List(1, 2) tuple List(3, 4) List((1, 3), (1, 4), (2, 3), (2, 4)) 14
16. The Applicative class trait Applicative[F[_]] { // from Functor def

map[A, B] (f: A => B, fa: F[A]): F[B] def map2[A, B, C] (f: (A, B) => C, fa: F[A], fb: F[B]): F[C] } 15

of data def fileRequest(user: User, file: Path): Future[Int] = for { token <- db.getAccessToken(user) input <- db.readFile(token, file) _ <- HTTP.sendHeader(HTTP.OK) written <- HTTP.sendBody(input) } yield written 16

=> F[B], fa: F[A]): F[B] } 17

=> F[B], fa: F[A]): F[B] def map2[A, B, C] (f: (A, B) => C, fa: F[A], fb: F[B]) = ??? } 17

=> F[B], fa: F[A]): F[B] def map2[A, B, C] (f: (A, B) => C, fa: F[A], fb: F[B]) = flatMap(a => flatMap(b => f(a, b), fb), fa) } 17

useless 20
24. Composing functors Input def intToString(x: Int): String val xss: List[List[Int]]

Output val yss: List[List[String]] = ??? 21
25. Demo₃

23

Except we can’t 23

Except we can’t (in general) 23
29. Agenda 1 Functors, Applica ves, Monads 2 Composi on of

=> F[B], fa: F[A]): F[B] // Monad[G] def flatMap[A, B](f: A => F[B], ga: G[A]): G[B] Our Goal def flatMap[A, B] (f: A => F[G[B]], fga: F[G[A]]): F[G[B]] 25
31. Computer Science Interlude The Hal ng Problem It is undecidable

whether a program will terminate on a given input. 26
32. Computer Science Interlude The Hal ng Problem It is undecidable

whether a program will terminate on a given input. ... defeated? Yet there are programming languages which only accept termina ng programs. 26