## Where communities thrive

• Join over 1.5M+ people
• Join over 100K+ communities
• Free without limits
##### Activity
Vojtech Letal
@letalvoj
@kubukoz is not it inconvenient to use?
Fabio Labella
@SystemFw
@letalvoj there are some smart convienence functions
e.g. foldMap ala Min [1,2,3]
Vojtech Letal
@letalvoj
@SystemFw in cats? I still do not see how you pass the dual monoid to foldMap[A:Monoid,B] if you are constrained by the A using Dual tag
Fabio Labella
@SystemFw
@letalvoj ah sorry, I assumed you meant in Haskell :grimacing:
Jakub Kozłowski
@kubukoz
yeah in Scala it's not that convenient I guess
Rob Norris
@tpolecat
implicit class ParallelTraverseOps[F[_]: Traverse, A](fa: F[A]) {
def jankyParTraverse[G[_]: Concurrent, B](f: A => G[B]): G[F[B]] =
fa.traverse(a => f(a).start).flatMap(fs => fs.traverse(_.join))
}
thoughts?
Jakub Kozłowski
@kubukoz
I was actually thinking about something similar a few days ago
Fabio Labella
@SystemFw
we used to have the exact same thing in fs2
Jakub Kozłowski
@kubukoz
when I was asking for Traverse[Set], but well fsck there isn't one
Rob Norris
@tpolecat
haha
Fabio Labella
@SystemFw
removed when Parallel was introduced
but I'm kinda doubting that decision a bit
since parallel applies to Either and Validated as well
and a lot of people dont' want that polymorphism
Jakub Kozłowski
@kubukoz
crazy thought: deriving Parallel for every Concurrent?
Fabio Labella
@SystemFw
they literally want it to mean "run in parallel"
Rob Norris
@tpolecat
Right but I need something that's both Monad (Sync really) and Parallel and I'm not seeing it.
Fabio Labella
@SystemFw
Parallel relates a Monad and an Applicative
Jakub Kozłowski
@kubukoz
right
Fabio Labella
@SystemFw
so the first type param (which is the one you normally care about) is a monad
Rob Norris
@tpolecat
My F ends up being IO and there's no instance for it.
Christopher Davenport
@ChristopherDavenport
Par is all you need to indicate that generally.
Fabio Labella
@SystemFw
there is
Rob Norris
@tpolecat
oh?
Christopher Davenport
@ChristopherDavenport
F[_]: Sync : Par
Fabio Labella
@SystemFw
with cats-par, it's Par[IO]
with Parallel
Rob Norris
@tpolecat
oh what's cats-par?
Fabio Labella
@SystemFw
it's Parallel[IO, IO.Par]
Jakub Kozłowski
@kubukoz
Fabio Labella
@SystemFw
so in poly code you need two type params
Christopher Davenport
@ChristopherDavenport
My attempt to make Parallel not a giant PITA.
Fabio Labella
@SystemFw
def foo[F[_], G[_]](implicit ev: Parallel[F, G])
that's how you use it
however G is uniquely defined given F
and you don't normally care about which specific type it is, only that's related to F via Parallel
so it should really be a type member instead
Rob Norris
@tpolecat
Hm why isn't it a
right
Fabio Labella
@SystemFw
cats-par makes it so
Rob Norris
@tpolecat
gotcha
Fabio Labella
@SystemFw
and cats 2.0 will make it so as well
we're stuck with it for now
Christopher Davenport
@ChristopherDavenport
I wrote it, and I feel @SystemFw just explained it better than I could.
Fabio Labella
@SystemFw
lol
it's tripped virtually everyone
and it's weird because I remember the PR for it had a hugely long discussion with multiple reviewers, and no one realised it :P
Christopher Davenport
@ChristopherDavenport
Only thing is whether I shouldn’t have put the implicits in the package object. People in general are pretty happy that theres only one import but I think about it every once and a while.