Imports

The easiest approach to Сats imports is to import everything that's commonly needed:

import cats._
import cats.data._
import cats.syntax.all._

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 cats.data._, import brings in data structures such as Validated and State. Instead of the entire cats.data package, you can import only the types that you need, for example:

import cats.data.Validated
import cats.data.State

The cats.syntax.all._ import adds syntax enrichment onto certain types to provide some handy methods such as right-biased Either combinators:

import cats.syntax.all._

// Сats adds right-biased combinators to the standard library's Either
val e: Either[String, Int] = Right(3)
// e: Either[String, Int] = Right(value = 3)
e.map(_ + 1)
// res4: Either[String, Int] = Right(value = 4)

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

If you'd like to import à la carte, you can do so, by importing from cats.syntax for syntax enrichment. For example, if you'd like to import the Semigroup syntax:

import cats.syntax.semigroup._

"Hello, " |+| "World!"
// res7: String = "Hello, World!"

The import adds the |+| syntax.

Note: Beware that if you import a type class instance or its syntax twice, you will receive conflicting implicits with a less than helpful error message. This usually happens when importing different type classes in the same hierarchy or when importing syntax enrichment for all type classes using cats.syntax.all._ or cats.implicits._ together with a more specific import like cats.syntax.option._ or cats.instances.either._. Below is an example of this phenomenon:

import cats.syntax.all._

1 |+| 2

import cats.syntax.semigroup._

3 |+| 5 // error: value |+| is not a member of Int

Compilation fails on the second invocation of |+| because we now have conflicting implicits from Semigroup.