Leggendo la descrizione di Funtori su questo blog:Scala - Come utilizzare i Functional su tipi non funzionali?
https://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/
v'è una definizione generica di Functor e uno più specifico:
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)
}
Chiaramente questo significa Funtori può essere utilizzato con altri tipi di tipo superiore oltre a oggetti Function. Qualcuno potrebbe dare un esempio o spiegare come o perché o in quale scenario si farebbe? Vale a dire, quale sarebbe un'altra implementazione di GenericFunctor in Scala - che utilizza un costruttore di tipo diverso da Function? Grazie!
EDIT:
Giusto per chiarire:
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)
solo per chiarire, secondo la mia comprensione ListFunctor implementa l'1-arg FMAP nel GenericFunctor mentre il codice nella trascrizione repl chiama il FMAP in Trait Functor, che a sua volta chiama un'implementazione di fmap (ad es. In ListFunctor).
Questo non modifica la domanda generale, pensavo solo che avrebbe aiutato le persone a cercare di fornire risposte. Qualsiasi intuizione fornita sarebbe apprezzata.
Non penso che l'uno o l'altro sia un funtore. Non riesco a vedere come implementeresti una delle due categorie. – Anonymous