¿Esquemas de recurrencia para tontos?


83

Estoy buscando explicaciones realmente simples y fáciles de entender de los esquemas de recursividad y esquemas de corecursion (catamorfismos, anamorfismos, hilomorfismos, etc.) que no requieran seguir muchos enlaces o abrir un libro de texto de teoría de categorías. Estoy seguro de que he reinventado muchos de estos esquemas inconscientemente y los "apliqué" en mi cabeza durante el proceso de codificación (estoy seguro de que muchos de nosotros lo hemos hecho), pero no tengo ni idea de cuáles son los esquemas (co) recursivos que se llaman uso. (Está bien, mentí. Acabo de leer sobre algunos de ellos, lo que provocó esta pregunta. Pero antes de hoy, no tenía ni idea).

Creo que la difusión de estos conceptos dentro de la comunidad de programación se ha visto obstaculizada por las explicaciones prohibidas y los ejemplos que uno tiende a encontrar, por ejemplo en Wikipedia, pero también en otros lugares.

Probablemente también se haya visto obstaculizado por sus nombres. Creo que hay algunos nombres alternativos, menos matemáticos (¿algo sobre plátanos y alambre de púas?), Pero tampoco tengo ni idea de cuáles son los nombres más cortes para los esquemas de recursividad que uso.

Creo que ayudaría usar ejemplos con tipos de datos que representen problemas simples del mundo real, en lugar de tipos de datos abstractos como árboles binarios.


6
Jeremy Gibbons tiene varios artículos que podrían ser la mejor introducción, ya que son claros y en gran parte independientes. "Cambiadores de representación de flujo" (plegar y desplegar combinados), "Fisión para la comprensión del programa" (paramorfismos y más), "Despliegue subvalorado" (anamorfismos). cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html
stephen tetley

Respuestas:


44

Hablando de manera muy vaga, un catamorfismo es sólo una ligera generalización de fold, y un anamorfismo es una ligera generalización deunfold. (Y un hylomorfismo es solo un despliegue seguido de un pliegue). Por lo general, se presentan en una forma más rigurosa, para aclarar la conexión con la teoría de categorías. La forma más densa nos permite distinguir datos (el producto necesariamente finito de un álgebra inicial) y codatos (el producto posiblemente infinito de una coalgebra final). Esta distinción nos permite garantizar que nunca se llama a un pliegue en una lista infinita. La otra razón de la forma divertida en que los catamorfismos y anamorfismos generalmente se escriben es que al operar sobre F-álgebras y F-coalgebras (generadas a partir de functores) podemos escribirlos de una vez por todas, en lugar de una vez sobre una lista, una vez sobre una árbol binario, etc. Esto a su vez ayuda a aclarar exactamente por qué son todos iguales.

Pero desde el punto de vista de la intuición pura, puedes pensar en cata y ana como reductores y productores, y eso es todo.

Editar: un poco más

Un metamorfismo (Gibbons) es como un hylo de adentro hacia afuera: es un pliegue seguido de un despliegue. Por lo tanto, puede usarlo para derribar una corriente y construir una nueva con una estructura potencialmente diferente.

Ekmett publicó una buena "guía de campo" de los diversos esquemas en la literatura: http://comonad.com/reader/2009/recursion-schemes/

Sin embargo, mientras que las explicaciones "intuitivas" son sencillas, el código enlazado lo es menos, y las publicaciones de blog sobre algunas de estas pueden ser un poco complejas / prohibidas.

Dicho esto, excepto quizás por los histomorfismos, no creo que el resto del zoológico sea necesariamente algo con lo que uno quiera pensar directamente la mayor parte del tiempo. Si "entiendes" hylo y meta, puedes expresar casi cualquier cosa solo en términos de ellos. Normalmente, los otros morfismos son más restrictivos, no menos (pero por lo tanto te dan más propiedades "gratis").


1
De acuerdo, gracias, pero esos son solo esos tres, hay otros. Espero que alguien agregue una respuesta sobre algunos otros esquemas de recursividad.
Robin Green

3
La mayoría de los esquemas de recursividad restantes son algo oscuros, excepto quizás paramorfismos, que corresponden bastante bien a los "principios de inducción" para los tipos que a menudo vemos en los lenguajes dependientes. No he descubierto cómo funciona toda la teoría de categorías aquí, pero dudo que se rompa demasiado horriblemente :)
copumpkin

3
El paramorfismo es como un pliegue, pero puedes echar un vistazo al "resto de la entrada". Un pliegue solo le da acceso elemental durante el recorrido.
Stephen Tetley

23

Algunas referencias, desde las más teóricas de categorías (pero relevantes para dar un "mapa de territorio" que te permitirá evitar "hacer clic en muchos enlaces") hasta las más simples y autónomas:

  • En lo que respecta al vocabulario de "plátanos y alambre de púas", proviene del artículo original de Meijer, Fokkinga & Patterson (y su secuela de otros autores), y en resumen es tan pesado en notación como las alternativas menos lindas: los "nombres" (bananas, etc.) son solo un atajo a la apariencia gráfica de la notación ascii de las construcciones a las que están vinculadas. Por ejemplo, los catamorfismos (es decir, los pliegues) se representan con (| _ |), y el par-con-paréntesis parece un "plátano", de ahí el nombre. Este es el periódico al que se suele llamar "impenetrable", por lo que no es lo primero que buscaría si fuera usted.

  • La referencia básica para esos esquemas de recursividad (o más precisamente, para un enfoque relacional de esos esquemas de recursividad) es Álgebra de programación de Bird & de Moor (el libro no está disponible excepto como impresión bajo demanda, pero hay copias disponibles de segunda mano). & debería estar en bibliotecas). Contiene una explicación más detallada y pausada de la programación sin puntos, aunque sigue siendo "académica": el libro presenta cierto vocabulario de teoría de categorías, aunque de manera autónoma. Sin embargo, los ejercicios (que no encontrarías en un artículo) ayudan.

  • Clasificación de morfismos de Lex Augustjein , utiliza algoritmos de clasificación en varias estructuras de datos para explicar los esquemas de recursividad. Es más o menos " esquemas de recursividad para dummies " por construcción:

    Esta presentación brinda la oportunidad de introducir los diversos morfismos de una manera simple, es decir, como patrones de recursividad que son útiles en la programación funcional, en lugar del enfoque habitual a través de la teoría de categorías, que tiende a ser innecesariamente intimidante para el programador promedio.

  • Otro enfoque para hacer una presentación sin símbolos es el capítulo Programación en origami de Jeremy Gibbons en La diversión de la programación , con cierta superposición con el anterior. Su bibliografía da un recorrido por las introducciones al tema.

    Editar: Jeremy Gibbons solo avíseme que ha agregado un enlace a la bibliografía de todo el libro en la página web del libro después de leer esta pregunta. ¡ Disfruta !

Me temo que estas dos últimas referencias solo dan una explicación sólida de los morfismos (cata | ana | hylo | para), pero espero que esto sea suficiente para romper con el formalismo algebraico que puede encontrar en publicaciones con más notación. No conozco ninguna explicación estrictamente no teórica de categorías de los esquemas de (co) recursividad que no sean esos cuatro.


16

Tim Williams dio anoche una brillante charla en el London Haskell User Group sobre los esquemas de recursividad con un ejemplo motivador de cada uno de los que mencionas. Mira las diapositivas:

http://www.timphilipwilliams.com/slides.html

Hay referencias a todos los sospechosos habituales (lentes, plátanos, alambres de púas a la carta, etc.) al final de las diapositivas y también puedes buscar en Google "Origami Programming", que es una buena introducción que no había encontrado antes.

y el video estará aquí cuando se cargue:

http://www.youtube.com/user/LondonHaskell

editar La mayoría de los enlaces en cuestión están en la respuesta de huitseeker anterior.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.