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:
- Wat fa esattamente
F[_] : Applicative
significa? - Perché lo
F[_]
ha qualcosa a che fare conApplicative
? Abbiamo bisogno diApplicative[F]
, non F [qualcosa] estende Applicativo giusto? - Perché questo metodo utilizza valori impliciti di tipo
Applicative[F]
senza dichiarare parametri impliciti?
Aha, quindi questa ** è ** una funzione linguistica speciale! Grazie! – Rotsor