- Implement Monad[Try].
implicit val tryMonad = new Monad[Try] {
override def unit[A](a: => A): Try[A] = Success(a)
override def flatMap[A, B](a: Try[A])(f: A => Try[B]): Try[B] = a match {
case Success(value) => f(value)
case Failure(ex) => Failure(ex)
}
}
- Prove the right identity law for the State monad.
Let's start with the property definition we had in this chapter:
val rightIdentity = forAll { (a: A, f: A => M[B]) =>
M.flatMap(M.unit(a))(f) == f(a)
}
Let f(a) = a => State(s => (b, s2))
First, we substitute the definition of unit with the result of the call. Hence, M.flatMap(M.unit(a))(f) becomes M.flatMap(State(s => (a, s)))(f).
Next, we substitute M.flatMap with compose, which gives us State(s => (a, s)).compose(f).
Next, we'll use the lemma proved in this chapter to substitute the compose call with the definition...