Los símbolos en sí mismos no significan nada. Son nombres arbitrarios Heiko recogió:
> class Foo[A, B]
defined class Foo
> class Foo[M1[_], M2[_]]
defined class Foo
> class GenericFunctor[->>[_, _], ->>>[_, _], F[_]]
defined class GenericFunctor
que son partes de los parámetros del tipo que ellos mismos son constructores de tipos (tipos de mayor kinded si quieres sonar de lujo). Las aplicaciones de tipo pueden escribirse infija, por lo que A ->> B
es igual que ->>[A, B]
.
De acuerdo con lo que está pasando ... Heiko dice
En cuanto a los ingredientes, encontramos todo lo que necesitamos: Tipos A
y B
se asignan a tipos de F[A]
y F[B]
y mapas A ->> B
se asignan a los mapas F[A] ->>> F[B]
.
Como hablamos de teoría de categorías, queremos evitar el término función porque eso es específico de la implementación, pero queremos describir algo así como una función. Algo-como-una-función en su jerga es una flecha. Necesitamos dos de ellos ya que no queremos suponer que las flechas entrantes y salientes sean las mismas. Estas dos flechas están representadas por ->>
y ->>>
. F[_]
es un contenedor como List
y Option
. Creo que ...
Así que fmap
(también conocido como map
método en Scala) toma una flecha de valores y devuelve otra flecha de contenedores. Excepto que a diferencia del método map
, fmap
devuelve una flecha que toma un contenedor.
Una aplicación específica de la GenericFunctor
usando Function
para ambas flechas es Functor
. Y la aplicación específica de Functor
que usa List
para el contenedor es ListFunctor
.
object ListFunctor extends Functor[List] {
def fmap[A, B](f: A => B): List[A] => List[B] = as => as map f
}
Así que está teniendo una función de A
a B
, y el retorno de una función a partir de List[A]
a List[B]
, llamando map
internamente.
Hola Eugene, ¡gran respuesta! – jxstanford
¿Qué significa la Lista [B] = as ** => como mapa **? Nunca vi esa sintaxis – Jay