参数P的隐式值在哪里:cats.Parallel [cats.effect.IO,F]

时间:2018-12-12 13:52:11

标签: scala-cats

在Cats Effect文档的子主题parSequence下运行示例代码段会引发错误,

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]

我包含隐式Timer[IO],即implicit val timer = IO.timer(ExecutionContext.global),但无效。请指教。谢谢

更新#1

有关完整的工作摘要,

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

1 个答案:

答案 0 :(得分:0)

您要查找的隐式是在cats.effect.IOInstances中定义的,您可以通过导入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 {
  // ...
}

请注意,如果要使用ContextShift[IO]实例,则必须在作用域中包含隐式ioParallel

在Scala中,常见的模式是将隐式实例定义为该类的伴随对象的一部分(在这种情况下为IO)。