Pagini
Workshops
Parteneri
This is an old revision of the document!
Monads, baby!
Today we look at certain kinds of computations from a truly functional perspective:
But we won't get into math and category theory for this.
We'll see what a monad is from a programming perspective, directly in the Scala language.
You can find today's contents here.
Let's implement some of our own monads.
Option
. Let's call this Maybe
, as in Haskell.Maybe[T]
(remember the [T]
is equivalent to Java's <T>
syntax for generics)Maybe
:map
, flatMap
, filter
zipWith
, which receives a Maybe[A]
and returns a Maybe[(T,A)]
def zipWith[A](other: Maybe[A]): Maybe[(T,A)]
If either this
or other
is empty, the result will be an empty Option
.
exists
, which receives a predicate (a function of T to Boolean) and returns true if this instance contains an element which satisfies the predicateorElse
, a special method for Maybe
, which returns this instance if it's not empty, or an alternative otherwise; the signature will bedef orElse(alternative: Option[A]): Option[A]
How can you delay the computation of the alternative until you actually need it? (hint: call by value/call by name)
Maybe
trait:isEmpty
toList
size
Just[T]
and None
and implement the methodsTry
monad, call this Attempt[T]
.Attempt[T]
and two case subclasses, Success[T]
and Fail
Success
has a member of type T
, Fail has a member of type Throwable
Attempt
and implement them in the subclasses:map
, flatMap
, filter
zipWith
exists
isEmpty
, toList
, size
recoverWith
; the method returns an alternative Attempt
computation if this one fails