2011-08-18 23 views
5

Ben Scalaz içinde Traverse özelliği aşağıdaki işlevi tanımı anlamak mücadele ediyorum:Scalaz `F [_]: Applicative 'tip kısıtlaması örtük parametrelerin kullanımını nasıl sağlar?

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

anlamıyorum bölüm F[_] : Applicative olduğunu.

Şimdi, Applicative ne olduğunu görelim: Burada

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) 
} 

, traverse bazı tip F için çalışmak için, bir kapsamda tip Applicative[F] örtülü bir nesneyi getirmek gerekiyor.

Ben bazı şeyleri anlamak istiyorum:

  1. Wat tam F[_] : Applicative anlama geliyor?
  2. F[_], Applicative ile bir sorun mu var? Applicative[F]'a ihtiyacımız var, F [bir şey] Uygulamanın doğru değil mi?
  3. Bu yöntemde, örtülü parametreler bildirilmeden Applicative[F] türünde örtük değerler kullanılıyor?

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

    bu eşdeğerdir:

cevap

6

tüm üç soru bu notasyonu gerçeği ile yanıtlanabilir düşünüyorum

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

ilk gösterimi bir context boundF[_] için olarak bilinir .

+0

Aha, bu yüzden ** bu özel bir dil özelliğidir! Teşekkür ederim! – Rotsor