5

TraverseScalaz の traitの次の関数定義を理解するのに苦労しています:

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

ここで、 fortraverseが何らかの type に対して機能するにFは、 type の暗黙的なオブジェクトをApplicative[F]スコープに入れる必要があります。

私はいくつかのことを理解したいです:

  1. どういうF[_] : Applicative意味ですか?
  2. F[_]と関係があるのはなぜApplicativeですか?Applicative[F]F[something] extends Applicative じゃなくて が必要ですよね?
  3. Applicative[F]このメソッドは、暗黙的なパラメーターを宣言せずに型の暗黙的な値を使用するのはなぜですか?
4

1 に答える 1

6

この 3 つの質問はすべて、次の表記法で答えることができると思います。

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

これと同等です:

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

最初の表記は、 にバインドされたコンテキストとして知られていますF[_]

于 2011-08-18T15:01:57.197 に答える