Implicit scope

The implicit scope of a type T is where the compiler will look when attempting to locate implicit instances for that type. It is composed of all the companion objects of types associated with T.

To take a concrete example:

class Foo

object Foo {
  implicit val bar: List[Foo] = List.empty
}

bar is of type List[Foo], and is located within the companion object of Foo, a type associated with List[Foo]: it’s in the implicit scope of List[Foo] and we need no special import for the compiler to locate it.

implicitly[List[Foo]]
// res0: List[Foo] = List()

The implicit scope is particularly helpful when defining type class instances.