2011-08-18 25 views
5

Tôi đang gặp khó khăn để hiểu được định nghĩa hàm sau trong Traverse đặc điểm trong Scalaz:Scalaz `F [_]: Ràng buộc loại áp dụng` ngụ ý sử dụng các tham số ngầm định như thế nào?

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

Phần tôi không hiểu là F[_] : Applicative.

Bây giờ, chúng ta hãy xem Applicative là gì:

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

Ở đây, cho traverse để làm việc cho một số loại F, người ta cần để mang lại một đối tượng tiềm ẩn của loại Applicative[F] trong phạm vi.

Tôi muốn hiểu một vài điều:

  1. Wat chính xác không F[_] : Applicative nghĩa là gì?
  2. Tại sao F[_] có liên quan đến Applicative? Chúng ta cần Applicative[F], chứ không phải F [cái gì đó] mở rộng quyền ứng dụng?
  3. Tại sao phương pháp này sử dụng giá trị ẩn của loại Applicative[F] mà không khai báo các tham số ngầm?

Trả lời

6

Tôi nghĩ rằng tất cả ba câu hỏi có thể được trả lời với thực tế là ký hiệu này:

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

tương đương với điều này:

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

Ký hiệu đầu tiên được biết đến như một context bound cho F[_] .

+0

Aha, vì vậy tính năng ** này là ** một tính năng ngôn ngữ đặc biệt! Cảm ơn bạn! – Rotsor