Ich suche nach wirklich einfachen, leicht verständlichen Erklärungen für Rekursionsschemata und Corecursionsschemata (Katamorphismen, Anamorphismen, Hylomorphismen usw.), für die es nicht erforderlich ist, vielen Links zu folgen oder ein Lehrbuch zur Kategorietheorie zu öffnen. Ich bin sicher, dass ich viele dieser Schemata unbewusst neu erfunden und sie während des Codierungsprozesses in meinem Kopf "angewendet" habe (ich bin sicher, dass viele von uns dies getan haben), aber ich habe keine Ahnung, was die (Co-) Rekursionsschemata ich bin Verwendung genannt werden. (OK, ich habe gelogen. Ich habe gerade über einige von ihnen gelesen, was diese Frage aufgeworfen hat. Aber bis heute hatte ich keine Ahnung.)
Ich denke, die Verbreitung dieser Konzepte innerhalb der Programmiergemeinschaft wurde durch die verbotenen Erklärungen und Beispiele behindert, auf die man häufig stößt - zum Beispiel auf Wikipedia, aber auch anderswo.
Es wurde wahrscheinlich auch durch ihre Namen behindert. Ich denke, es gibt einige alternative, weniger mathematische Namen (etwas über Bananen und Stacheldraht?), Aber ich habe keine Ahnung, was die süßeren Namen für Rekursionsschemata sind, die ich auch verwende.
Ich denke, es wäre hilfreich, Beispiele mit Datentypen zu verwenden, die einfache Probleme der realen Welt darstellen, anstatt abstrakte Datentypen wie Binärbäume.
quelle
Antworten:
Ein Katamorphismus ist nur eine geringfügige Verallgemeinerung von
fold
, und ein Anamorphismus ist eine geringfügige Verallgemeinerung vonunfold
. (Und ein Hylomorphismus ist nur eine Entfaltung, gefolgt von einer Falte.) Sie werden normalerweise in einer strengeren Form dargestellt, um den Zusammenhang mit der Kategorietheorie klarer zu machen. Die dichtere Form ermöglicht es uns, Daten (das notwendigerweise endliche Produkt einer anfänglichen Algebra) und Codaten (das möglicherweise unendliche Produkt einer endgültigen Kohlegebra) zu unterscheiden. Diese Unterscheidung lässt uns garantieren, dass eine Falte niemals auf einer unendlichen Liste aufgerufen wird. Der andere Grund für die lustige Art und Weise, wie Katamorphismen und Anamorphismen im Allgemeinen geschrieben werden, ist, dass wir sie durch Arbeiten mit F-Algebren und F-Kohlegebren (die von Funktoren erzeugt werden) ein für alle Mal schreiben können, anstatt einmal über eine Liste, einmal über a Binärbaum usw. Dies hilft wiederum, genau zu verdeutlichen, warum sie alle dasselbe sind.Aber von einem rein intuitiven Standpunkt aus kann man sich Cata und Ana als Reduzieren und Produzieren vorstellen, und das war's auch schon.
Edit: ein bisschen mehr
Eine Metamorphose (Gibbons) ist wie ein Inside-Out-Hylo - es ist eine Falte, gefolgt von einer Entfaltung. Sie können es also verwenden, um einen Stream abzureißen und einen neuen mit einer möglicherweise anderen Struktur aufzubauen.
Ekmett hat einen schönen "Feldführer" zu den verschiedenen Schemata in der Literatur veröffentlicht: http://comonad.com/reader/2009/recursion-schemes/
Während die "intuitiven" Erklärungen unkompliziert sind, ist der verknüpfte Code weniger einfach, und die Blog-Beiträge zu einigen davon sind möglicherweise etwas komplex / verboten.
Abgesehen von Histomorphismen denke ich jedoch nicht, dass der Rest des Zoos notwendigerweise etwas ist, mit dem man die meiste Zeit direkt denken möchte. Wenn Sie Hylo und Meta "bekommen", können Sie fast alles in Bezug auf sie alleine ausdrücken. In der Regel sind die anderen Morphismen restriktiver und nicht weniger (bieten Ihnen jedoch "kostenlos" mehr Eigenschaften).
quelle
Einige Referenzen, von der kategorietheoretischsten (aber relevantesten, um eine "Gebietskarte" zu erstellen, mit der Sie vermeiden können, "auf viele Links zu klicken") bis hin zu den einfacheren und eigenständigeren:
Das Vokabular "Bananen & Stacheldraht" stammt aus dem Originalpapier von Meijer, Fokkinga & Patterson (und seiner Fortsetzung von anderen Autoren) und ist in der Summe genauso notationslastig wie die weniger niedlichen Alternativen: Die "Namen" (Bananen usw.) sind nur eine Abkürzung zum grafischen Erscheinungsbild der ASCII-Notation der Konstruktionen, an die sie gebunden sind. Zum Beispiel werden Katamorphismen (dh Falten) mit dargestellt
(| _ |)
, und die Par-with-Klammer sieht aus wie eine "Banane", daher der Name. Dies ist das Papier, das am häufigsten als "undurchdringlich" bezeichnet wird, daher nicht das erste, was ich nachschlagen würde, wenn ich Sie wäre.Die grundlegende Referenz für die Rekursion Schemata (oder genauer gesagt, für einen relationalen Ansatz zu diesen Rekursion Systemen) ist Bird & de Moor Algebra of Programming (das Buch nicht verfügbar ist , außer als Druck-on - Demand, aber es geben Kopien verfügbar Gebrauchtwaren & es sollte in Bibliotheken sein). Es enthält eine ausführlichere und detailliertere Erklärung der punktfreien Programmierung, wenn auch noch "akademisch": Das Buch führt ein kategorietheoretisches Vokabular ein, wenn auch auf eigenständige Weise. Die Übungen (die Sie in einem Artikel nicht finden würden) helfen jedoch.
Das Sortieren von Morphismen nach Lex Augustjein verwendet Sortieralgorithmen für verschiedene Datenstrukturen, um Rekursionsschemata zu erklären. Es handelt sich so ziemlich um " Rekursionsschemata für Dummies ":
Ein weiterer Ansatz für eine symbolfreie Präsentation ist Jeremy Gibbons Kapitel Origami-Programmierung in The Fun of Programming , das sich teilweise mit dem vorherigen überschneidet. Die Bibliographie gibt einen Überblick über die Einführungen in das Thema.
Bearbeiten: Jeremy Gibbons hat mich nur wissen lassen, dass er nach dem Lesen dieser Frage einen Link zur Bibliographie des gesamten Buches auf der Webseite des Buches hinzugefügt hat . Viel Spaß !
Ich fürchte, diese beiden letzten Referenzen geben nur eine solide Erklärung für (cata | ana | hylo | para) -Morphismen, aber ich hoffe, dass dies ausreichen würde, um den algebraischen Formalismus zu durchbrechen, den Sie in notationsintensiveren Veröffentlichungen finden können. Ich kenne keine streng nicht kategorietheoretische Erklärung für andere (Co-) Rekursionsschemata als diese vier.
quelle
Tim Williams hielt gestern Abend in der London Haskell User Group einen brillanten Vortrag über Rekursionsschemata mit einem motivierenden Beispiel für jedes der von Ihnen erwähnten. Schauen Sie sich die Folien an:
http://www.timphilipwilliams.com/slides.html
Am Ende der Folien finden Sie Hinweise auf alle üblichen Verdächtigen (Linsen, Bananen, Stacheldraht à la carte usw.). Sie können auch "Origami-Programmierung" googeln, ein nettes Intro, das ich vorher noch nicht gesehen habe.
und das Video wird hier sein, wenn es hochgeladen wird:
http://www.youtube.com/user/LondonHaskell
edit Die meisten der fraglichen Links sind in der obigen Antwort von huitseeker enthalten.
quelle