Читая описание Functors в этом блоге:
https://hseeberger.wordpress.com/2010/11/25 / Introduction-to-category-theory-in-scala /
существует общее определение Functor и более конкретное:
trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] {
def fmap[A, B](f: A ->> B): F[A] ->>> F[B]
}
trait Functor[F[_]] extends GenericFunctor[Function, Function, F] {
final def fmap[A, B](as: F[A])(f: A => B): F[B] =
fmap(f)(as)
}
Очевидно, это означает, что Functors могут использоваться с другими высокоуровневыми типами помимо объектов Function. Не мог бы кто-нибудь привести пример или объяснить, как, почему или в каком сценарии это будет сделано? А именно, какой была бы другая реализация GenericFunctor в Scala - которая использует конструктор типов, отличный от Function? Спасибо!
РЕДАКТИРОВАТЬ:
Просто чтобы прояснить:
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
}
}
scala> fmap(List(1, 2, 3))(x => x + 1)
res0: List[Int] = List(2, 3, 4)
Просто чтобы прояснить, насколько я понимаю, ListFunctor реализует fmap с 1 аргументом в GenericFunctor, в то время как код в транскрипте repl вызывает fmap в Trait Functor, который, в свою очередь, вызывает реализация fmap (например, в ListFunctor).
Это не меняет общего вопроса, просто подумал, что это поможет людям, пытающимся дать ответы. Приветствуются любые предоставленные сведения.