The easiest approach to cats imports is to import everything that’s commonly needed:

import cats._
import cats.implicits._

The cats._ import brings in quite a few type classes (similar to interfaces) such as Monad, Semigroup, and Foldable. Instead of the entire cats package, you can import only the types that you need, for example:

import cats.Monad
import cats.Semigroup
import cats.Foldable

The, import brings in data structures such as Validated and State. Instead of the entire package, you can import only the types that you need, for example:


The cats.implicits._ import does a couple of things. Firstly, it brings in implicit type class instances for standard library types - so after this import you will have Monad[List] and Semigroup[Int] instances in implicit scope. Secondly, it adds syntax enrichment onto certain types to provide some handy methods such as right-biased Either combinators:

// cats adds right-biased combinators to the standard library's Either
val e: Either[String, Int] = Right(3)
// e: Either[String,Int] = Right(3) + 1)
// res1: scala.util.Either[String,Int] = Right(4)

// cats adds an orEmpty method to the standard library's Option
val o: Option[String] = None
// o: Option[String] = None

// res3: String = ""

Note: if you import cats.implicits._ (the preferred method), you should not also use imports like cats.syntax.option._ or cats.instances.either._. This can result in ambiguous implicit values that cause bewildering compile errors.