2011-08-18 6 views
5

나는 Scalaz에 Traverse 특성에 다음 함수의 정의를 이해하는 데 어려움을 겪고 오전 :Scalaz`F [_] : Applicative` 타입 제약은 암시 적 파라미터의 사용을 어떻게 의미합니까?

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

내가 이해하지 못하는 부분은 F[_] : Applicative이다.

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

traverse이 어떤 종류의 F 위해 일을 위해, 하나는 범위 형 Applicative[F]의 내장 객체를 가져올 필요가있다.

나는 몇 가지를 이해하고 싶습니다 :

  1. 와트는 정확히 F[_] : Applicative는 뜻입니까?
  2. F[_]Applicative과 어떤 관련이 있습니까? 우리는 Applicative[F]이 필요합니다. F [무언가]가 적용 권리를 연장하지 않습니까?
  3. 왜이 메서드는 암시 적 매개 변수를 선언하지 않고 Applicative[F] 유형의 암시 적 값을 사용합니까?

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

    이 동일합니다 :

답변

6

나는 세 가지 질문이 표기법이 사실로 대답 할 수 있다고 생각

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

첫 번째 표기법은 context boundF[_]에 대한 알려져 있습니다 .

+0

아하, **이 ** 특수 언어 기능입니다! 고맙습니다! – Rotsor