2011-08-18 6 views
5

Ho difficoltà a comprendere la seguente definizione di funzione in Traverse tratto in Scalaz:In che modo il vincolo di tipo Scalaz `F [_]: Applicative` implica l'uso di parametri impliciti?

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]]

La parte che non capisco è F[_] : Applicative.

Ora, vediamo cosa è Applicative:

trait Applicative[Z[_]] extends Pointed[Z] with Apply[Z] { 
    override def fmap[A, B](fa: Z[A], f: A => B): Z[B] = this(pure(f), fa) 
    override def apply[A, B](f: Z[A => B], a: Z[A]): Z[B] = liftA2(f, a, (_:A => B)(_: A)) 
    def liftA2[A, B, C](a: Z[A], b: Z[B], f: (A, B) => C): Z[C] = apply(fmap(a, f.curried), b) 
} 

Qui, per traverse a lavorare per un certo tipo F, si ha la necessità di portare un oggetto di tipo implicita Applicative[F] portata.

Mi piacerebbe capire diverse cose:

  1. Wat fa esattamente F[_] : Applicative significa?
  2. Perché lo F[_] ha qualcosa a che fare con Applicative? Abbiamo bisogno di Applicative[F], non F [qualcosa] estende Applicativo giusto?
  3. Perché questo metodo utilizza valori impliciti di tipo Applicative[F] senza dichiarare parametri impliciti?

risposta

6

penso che tutte e tre le domande si può rispondere con il fatto che questa notazione:

def traverse[F[_] : Applicative, A, B](f: A => F[B], t: T[A]): F[T[B]] 

equivale a questo:

def traverse[F[_], A, B](f: A => F[B], t: T[A])(implicit $ev: Applicative[F]): F[T[B]] 

La prima notazione è conosciuto come un context bound per F[_] .

+0

Aha, quindi questa ** è ** una funzione linguistica speciale! Grazie! – Rotsor