En una respuesta anterior en el sitio de Teoría de la informática , dije que la teoría de categorías es la "base" para la teoría de tipos. Aquí, me gustaría decir algo más fuerte. La teoría de categorías es la teoría de tipos . Por el contrario, la teoría de tipos es teoría de categorías . Permítanme ampliar estos puntos.
La teoría de categorías es teoría de tipos
En cualquier lenguaje formal escrito, e incluso en matemáticas normales usando la notación informal, terminamos declarar funciones con tipos . Implícita en la escritura, esta es la idea de que y son algunas cosas llamadas "tipos" es una "función" de un tipo a otro. La teoría de categorías es la teoría algebraica de tales "tipos" y "funciones". (Oficialmente, la teoría de categorías los llama "objetos" y "morfismos" para evitar pisar los dedos de los teóricos de los tradicionalistas, pero cada vez más veo teóricos de categorías arrojando tanta precaución al viento y usando los términos más intuitivos: "tipo "y" función ". Pero,f:A→BB fABf
Todos hemos sido educados en la teoría de conjuntos desde la escuela secundaria en adelante. Entonces, estamos acostumbrados a pensar en tipos como y como conjuntos, y funciones como como asignaciones teóricas de conjuntos. Si nunca pensó en ellos de esa manera, está en buena forma. Has escapado del lavado de cerebro teórico de conjuntos. La teoría de categorías dice que hay muchos tipos de tipos y muchos tipos de funciones. Entonces, la idea de los tipos como conjuntos es limitante. En cambio, la teoría de categorías axiomatiza los tipos y funciones de forma algebraica. Básicamente, eso es lo que es la teoría de categorías. Una teoría de tipos y funciones. Se vuelve bastante sofisticado e involucra altos niveles de abstracción. Pero, si puede aprenderlo, adquirirá una comprensión profunda de los tipos y funciones.B fABf
La teoría de tipos es teoría de categorías
Por "teoría de tipos", me refiero a cualquier tipo de lenguaje formal escrito, basado en reglas rígidas de formación de términos que aseguran que todo tipo verifique. Resulta que, cada vez que trabajamos en un lenguaje así, estamos trabajando en una estructura teórica de categorías. Incluso si usamos notaciones de teoría de conjuntos y pensamos teóricamente, terminamos escribiendo cosas que tienen sentido categóricamente. Ese es un hecho asombroso .
Históricamente, Dana Scott pudo haber sido la primera en darse cuenta de esto. Trabajó en la producción de modelos semánticos de lenguajes de programación basados en cálculo lambda con tipo (y sin tipo). Los modelos tradicionales de teoría de conjuntos eran inadecuados para este propósito, porque los lenguajes de programación implican una recursión sin restricciones que carece de teoría de conjuntos. Scott inventó una serie de modelos semánticos que capturaban fenómenos de programación, y se dio cuenta de que el cálculo lambda mecanografiado representaba exactamente una clase de categorías llamadas categorías cerradas cartesianas . Hay muchas categorías cerradas cartesianas que no son "teóricas de conjuntos". Pero el cálculo lambda mecanografiado se aplica a todos por igual. Scott escribió un bonito ensayo llamado " Teorías relacionadas del cálculo lambda"explicando lo que está sucediendo, partes de las cuales parecen estar disponibles en la web. El artículo original fue publicado en un volumen llamado" A HB Curry: Ensayos sobre lógica combinatoria, cálculo y formalismo de Lambda ", Academic Press, 1980. Berry y Curien llegó a la misma conclusión, probablemente de forma independiente: definieron una máquina abstracta categórica (CAM) para usar estas ideas en la implementación de lenguajes funcionales, y el lenguaje que implementaron se llamó "CAML", que es el marco subyacente de F # de Microsoft .
Los constructores de tipo estándar como , , , etc. son functors . Eso significa que no solo asignan tipos a tipos, sino que también funcionan entre tipos a funciones entre tipos. Las funciones polimórficas preservan todas esas funciones resultantes de las acciones del functor. La teoría de categorías fue inventada en 1950 por Eilenberg y MacLane→ L i s t×→Listprecisamente para formalizar el concepto de funciones polimórficas. Los llamaron "transformaciones naturales", "naturales" porque son los únicos que puede escribir de forma correcta usando variables de tipo. Entonces, uno podría decir que la teoría de categorías fue inventada precisamente para formalizar lenguajes de programación polimórficos, ¡incluso antes de que los lenguajes de programación surgieran!
Un tradicionalista teórico de conjuntos no tiene conocimiento de los functores y las transformaciones naturales que están ocurriendo bajo la superficie cuando usa anotaciones teóricas de conjuntos. Pero, mientras esté usando el sistema de tipos fielmente, realmente está haciendo construcciones categóricas sin darse cuenta de ellas.
Dicho y hecho, la teoría de categorías es la teoría matemática por excelencia de tipos y funciones. Por lo tanto, todos los programadores pueden beneficiarse al aprender un poco de teoría de categorías, especialmente los programadores funcionales. Desafortunadamente, no parece haber ningún libro de texto sobre teoría de categorías dirigido específicamente a los programadores. Los libros de "teoría de categorías para ciencias de la computación" generalmente están dirigidos a estudiantes / investigadores teóricos de ciencias de la computación. El libro de Benjamin Pierce, Teoría de la categoría básica para informáticos es quizás el más legible de ellos.
Sin embargo, hay muchos recursos en la web, que están dirigidos a los programadores. La página de Haskellwiki puede ser un buen punto de partida. En la Escuela de Graduados de Midlands , tenemos conferencias sobre teoría de categorías (entre otras). El curso de Graham Hutton se definió como un curso "para principiantes" y el mío como un curso "avanzado". Pero ambos cubren esencialmente el mismo contenido, llegando a profundidades diferentes. La Universidad de Chalmers tiene una buena página de recursos sobre libros y notas de conferencias de todo el mundo. El entusiasta sitio del blog "sigfpe" también ofrece muchas buenas intuiciones desde el punto de vista del programador.
Los temas básicos que le gustaría aprender son:
- definición de categorías y algunos ejemplos de categorías
- functors, y ejemplos de ellos
- transformaciones naturales y ejemplos de ellas
- definiciones de productos, coproductos y exponentes (espacios de funciones), objetos iniciales y terminales.
- adjuntos
- categorías mónadas, álgebras y Kleisli
Mis propias notas de clase en Midlands Graduate School cubren todos estos temas excepto el último (mónadas). Hay muchos otros recursos disponibles para las mónadas en estos días. Entonces eso no es una gran pérdida.
Cuantas más matemáticas conozca, más fácil será aprender teoría de categorías. Debido a que la teoría de categorías es una teoría general de las estructuras matemáticas, es útil conocer algunos ejemplos para apreciar lo que significan las definiciones. (Cuando aprendí la teoría de categorías, tuve que inventar mis propios ejemplos usando mi conocimiento de la semántica del lenguaje de programación, porque los libros de texto estándar solo tenían ejemplos matemáticos, de los que no sabía nada). Luego vino el brillante libro de Lambek y Scott llamó " Introducción a la lógica categórica"qué teoría de categorías se relaciona con los sistemas de tipos (lo que llaman" lógica "). Ahora es posible comprender la teoría de categorías simplemente relacionándola con los sistemas de tipos, incluso sin conocer muchos ejemplos. Muchos de los recursos que mencioné anteriormente usan esto enfoque para explicar la teoría de categorías.