I discovered today that to use syntax extension for parTraverse/parSequence, a Monad[M] instance is required.
final class ParallelTraversableOps[T[_], A](val ta: T[A]) extends AnyVal {
def parTraverse[M[_]: Monad, F[_], B]
(f: A => M[B])(implicit T: Traverse[T], P: Parallel[M, F]): M[T[B]] =
Parallel.parTraverse(ta)(f)
}
While Parallel.parTraverse is defined as follows (notice lack of Monad[M])
def parTraverse[T[_]: Traverse, M[_], F[_], A, B]
(ta: T[A])(f: A => M[B])(implicit P: Parallel[M, F]): M[T[B]] = {
val gtb: F[T[B]] = Traverse[T].traverse(ta)(f andThen P.parallel.apply)(P.applicative)
P.sequential(gtb)
}
Same is true for parSequence. Is that an oversight?