私は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
アクセスしていますか?as
as
Functor.fmap
ListFunctor.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
です。どちらかが理解できれば、もう一方も理解できると思います。