1

私はhttp://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/を見ていますが、それがどのように機能するのか理解できないコードが少しあります:

object Functor {

  def fmap[A, B, F[_]](as: F[A])(f: A => B)(implicit functor: Functor[F]): F[B] =
    functor.fmap(as)(f)

  implicit object ListFunctor extends Functor[List] {
    def fmap[A, B](f: A => B): List[A] => List[B] =
      as => as map f
  }
}

具体的には、 の定義がのスコープ内にあり、(私が知る限り) にアクセスできない 場合、どのようにListFunctor.fmapアクセスしていますか?asasFunctor.fmapListFunctor.fmap

(ひねりに関連)定義された上記のコードには以前の反復があります:

trait Functor[F[_]] extends GenericFunctor[Function, Function, F] {
  final def fmap[A, B](as: F[A])(f: A => B): F[B] =
    fmap(f)(as)
}

object ListFunctor extends Functor[List] {
  def fmap[A, B](f: A => B): List[A] => List[B] = as => as map f
}

しかし、繰り返しにasなりますが、魔法のように にアクセスできるようListFunctorです。どちらかが理解できれば、もう一方も理解できると思います。

4

1 に答える 1

3

同じasではありません。同じ名前が (おそらく完全ではない) 誤って 2 つの場所で使用されているだけです。はas => as map f関数定義でありas、矢印の前の はまさにこの関数のパラメーターの宣言です。

のように書けば完全に等価ですx => x map f

于 2012-06-21T21:52:46.340 に答える