En la programación funcional, normalmente solo se trata de una categoría, la categoría de tipos. Esto se llama comúnmente Hask
cuando se trata de Haskell.
Tenga en cuenta que Hask
no es solo una colección (o clase) de tipos. También contiene morfismos entre los tipos. Estas son solo funciones.
Un functor es como una función entre dos categorías. Un functor de una categoría en sí mismo es un endofunctor: nombre aterrador, concepto simple.
- ¿Qué significa definir una variable en matemáticas?
- ¿Cómo es tomar CS 226r (Algoritmos Eficientes) en Harvard como estudiante?
- ¿Qué es una explicación intuitiva del teorema de Rice?
- ¿La informática teórica tiene algo que ver con la minería de datos?
- Intuitivamente, ¿qué es una función computable?
Un endofunctor en Haskell es básicamente un constructor de tipos, una función que toma un tipo y produce un nuevo tipo. Sin embargo, tenga en cuenta que un functor no solo trata con los objetos de la categoría (tipos en nuestro caso) sino también con los morfismos. Ese es el trabajo de fmap
en Haskell. (Entonces, lo que se llama un functor en el lenguaje de Haskell quizás se llama con mayor precisión un endofunctor).
Una mónada es un endofunctor, nuevamente, solo un Functor
en Haskell, junto con otras dos operaciones especiales (llamadas transformaciones naturales, pero no nos preocupemos demasiado por eso). Recuerde que el endofunctor aquí viene con un constructor de tipo, digamos T
Una de estas operaciones, llamada retorno o elevación , toma un objeto de tipo x
y produce un objeto de tipo T x
. Eso es bastante simple. Entonces, por ejemplo, en la mónada de la lista, esta operación toma un objeto, digamos de tipo Int
, y produce un objeto de tipo [Int]
. (¿Qué objeto, específicamente, podría producir? Por supuesto, solo la lista singleton cuyo elemento es precisamente el entero proporcionado).
La otra operación especial, llamada join , es un poco más interesante. Toma un objeto de tipo T (T x)
y produce un objeto del tipo más simple T x
: aplana las dos aplicaciones sucesivas del constructor de tipos. Nuevamente, como con todo esto, en realidad es muy simple. En la lista mónada, por ejemplo, esta operación de unión es solo concatenación de listas: toma una lista de listas y produce una sola lista.