Monads
A monad M
is a parametric type M[T]
with 2 operations:
flatMap
unit
that have to satisfy some laws.
extension [T, U](m: M[T])
def flatMap(f: T => M[U]): M[U]
def unit[T](x: T): M[U]
Examples of Monads
- List:
unit(x) = List(x)
- Set:
unit(x) = Set(x)
- Option:
unit(x) = Some(x)
Monad Laws
-
Associativity
m.flatMap(f).flatMap(g) == m.flatMap(f(_).flatMap(g))
-
Left unit
unit(x).flatMap(f) == f(x)
-
Right unit
m.flatMap(unit) == m
Significance of the laws for For-comprehension
-
Associativity says that one can "inline" nested.
for y <- for x <- m; y <- f(x) yield y z <- g(y) yield z // equivalent to for x <- m; y <- f(x); z <- g(y) yield z
-
Right unit says
for x <- m yield x // equivalent to m