@implicitNotFound("Implicit not found: scalaz.Unapply[${TC}, ${MA}]. Unable to unapply type `${MA}` into a type constructor of kind `M[_]` that is classified by the type class `${TC}`. Check that the type class is defined by compiling `implicitly[${TC}[type constructor]]` and review the implicits in object Unapply, which only cover common type \'shapes.\'")
Represents a type MA
that has been destructured into as a type constructor M[_]
applied to type A
, along with a corresponding type class instance TC[M]
.
The implicit conversions in the companion object provide a means to obtain type class instances for partially applied type constructors, in lieu of direct compiler support as described in SI-2712.
// Directly depending on Applicative[G]
def traverse[G[_], B](f: A => G[B])(implicit G: Applicative[G]): G[F[B]] =
G.traverse(self)(f)
// Indirect lookup of the Applicative instance
def traverseI[GB](f: A => GB)(implicit G: Unapply[Applicative, GB]): G.M[F[G.A]] /*G[F[B]*/ = {
G.TC.traverse(self)(a => G(f(a)))
}
// Deforested version of traverseI
def traverseI2[GB](f: A => GB)(implicit G: Unapply[Applicative, GB]): G.M[F[G.A]] /*G[F[B]*/ = {
G.TC.traverse(self)(G.leibniz.onF(f))
}
// Old usage
def stateTraverse1 {
import scalaz._, Scalaz._
import State.{State, stateMonad}
val ls = List(1, 2, 3)
val traverseOpt: Option[List[Int]] = ls.traverse(a => Some(a))
val traverseState: State[Int, List[Int]] = ls.traverse[State[Int, *], Int](a => State((x: Int) => (x + 1, a)))
}
// New usage
def stateTraverse2 {
import scalaz._, Scalaz._
val ls = List(1, 2, 3)
val traverseOpt: Option[List[Int]] = ls.traverseI(a => some(a))
val traverseState = ls.traverseI(a => State((x: Int) => (x + 1, a)))
}
Credits to Miles Sabin.
- Companion
- object
class Object
trait Matchable
class Any