Raise

Raise[F, E] expresses the ability to raise errors of type E in a functorial F[_] context. This means that a value of type F[A] may contain no A values but instead an E error value, and further map calls will not have any effect due to there being no value to execute the passed function on.

In that sense it is a less powerful version of ApplicativeError found in cats-core. In general, however, raiseError from ApplicativeError and raise from Raise should be equivalent.

The raise function has the following signature:

trait Raise[F[_], E] {
  def raise[A](e: E): F[A]
}

Here’s a quick example of how you might use it:

import cats._
import cats.implicits._
import cats.mtl._

def parseNumber[F[_]: Applicative](in: String)(implicit F: Raise[F, String]): F[Int] = {
  if (in.matches("-?[0-9]+")) in.toInt.pure[F]
  else F.raise(show"'$in' could not be parsed as a number")
}

val valid = parseNumber[Either[String, ?]]("123")
// valid: Either[String, Int] = Right(value = 123)
val invalid = parseNumber[Either[String, ?]]("123abc")
// invalid: Either[String, Int] = Left(
//   value = "'123abc' could not be parsed as a number"
// )