Unapply

@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.\'")
trait Unapply[TC[_[_]], MA]

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

Type members

Types

type A

The type that M was applied to

The type that M was applied to

type M[_]

The type constructor

The type constructor

Value members

Abstract methods

def TC: TC[M]

The instance of the type class

The instance of the type class

def leibniz: MA === M[A]

Evidence that MA === M[A]

Evidence that MA === M[A]

Concrete methods

@inline
final
def apply(ma: MA): M[A]

Compatibility.

Compatibility.