2012-01-29 8 views
8

Heiko Seeberger escribió una gran entrada de blog en la teoría de categorías aquí:En los parámetros del tipo Scala, ¿qué significan - >> y - >>>?

https://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/

En él, define un GenericFunctor así:

trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] { 
    def fmap[A, B](f: A ->> B): F[A] ->>> F[B] 
} 

yo no tenía ninguna suerte para encontrar referencias de documentación para los símbolos - >> y - >>> en la documentación. ¿Podría alguien explicar por favor lo que están haciendo?

Respuesta

14

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.

+0

Hola Eugene, ¡gran respuesta! – jxstanford

+0

¿Qué significa la Lista [B] = as ** => como mapa **? Nunca vi esa sintaxis – Jay

5

Una pista es que están entre corchetes en la definición de rasgo: son solo símbolos arbitrarios que han sido seleccionados por el autor del blog, al igual que [T] a menudo se elige para clases genéricas, rasgos y métodos. Estos aquí simplemente son tipos de alto grado (es decir, parámetros con parámetros).

El nombre de flecha fue elegido porque, como él dice,

"A - B >> es sólo otra manera de escribir - >> [A, B], que refleja muy bien el hecho de que estamos hablando de mapas aquí ".

+0

Hola Luigi, También una gran respuesta, pero le doy el cheque a Eugene para una explicación más profunda ... – jxstanford

Cuestiones relacionadas