Scala - Как использовать функторы для типов, не являющихся функциями?

Читая описание 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).

Это не меняет общего вопроса, просто подумал, что это поможет людям, пытающимся дать ответы. Приветствуются любые предоставленные сведения.

8
задан Dave L. 27 September 2011 в 18:01
поделиться