Search code examples
scalascala-cats

Where is the implicit value for parameter P: cats.Parallel[cats.effect.IO,F]


Running the example code snippet under the subtopic parSequence in Cats Effect document throws an error,

import cats._, cats.data._, cats.syntax.all._, cats.effect.IO

val anIO = IO(1)

val aLotOfIOs = NonEmptyList.of(anIO, anIO)
val ioOfList = aLotOfIOs.parSequence

<console>:44: error: could not find implicit value for parameter P: cats.Parallel[cats.effect.IO,F]

I include implicit Timer[IO] i.e. implicit val timer = IO.timer(ExecutionContext.global) but it does not work. Please advise. Thanks

Update #1

For a complete working snippet,

import cats._, cats.data._, cats.syntax.all._, cats.effect.IO
import scala.concurrent.ExecutionContext.Implicits.global

implicit val contextShift = IO.contextShift(global)

val anIO = IO(1)
val aLotOfIOs = NonEmptyList.of(anIO, anIO)
val ioOfList = aLotOfIOs.parSequence

Solution

  • The implicit you're looking for is defined in cats.effect.IOInstances and you can bring it in scope by importing cats.effect.IO._.

    private[effect] abstract class IOInstances extends IOLowPriorityInstances {
      //....
    
        implicit def ioParallel(implicit cs: ContextShift[IO]): Parallel[IO, IO.Par] =
        new Parallel[IO, IO.Par] {
          final override val applicative: Applicative[IO.Par] =
            parApplicative(cs)
          final override val monad: Monad[IO] =
            ioConcurrentEffect(cs)
    
          final override val sequential: ~>[IO.Par, IO] =
            new FunctionK[IO.Par, IO] { def apply[A](fa: IO.Par[A]): IO[A] = IO.Par.unwrap(fa) }
          final override val parallel: ~>[IO, IO.Par] =
            new FunctionK[IO, IO.Par] { def apply[A](fa: IO[A]): IO.Par[A] = IO.Par(fa) }
        }
    }
    
    object IO extends IOInstances {
      // ...
    }
    

    Note that you will need to have an implicit ContextShift[IO] in scope if you want to use the ioParallel instance.

    It is a common pattern in Scala to have implicit instances defined as part of the companion object for the class (in this case IO).