die erste Frage zu beantworten: Data.Foldable
ist nicht genug die Tiefe des Baumes zu berechnen. Die minimale vollständige Definition Foldable ist foldr
, die folgende Semantik immer hat:
foldr f z = Data.List.foldr f z . toList
In anderen Worten, eine Foldable
Instanz vollständig gekennzeichnet durch, wie es sich verhält auf einer Liste Projektion des Eingangs (dh toList
) , die die Tiefeninformation eines Baumes wegwerfen wird.
Andere Möglichkeiten, diese Idee, dass Foldable
hängt von einer Monoid Instanz beinhaltet die Überprüfung, die assoziativ oder die Tatsache sein, dass die verschiedenen fold
Funktionen, um die Elemente nacheinander in einer bestimmten Reihenfolge ohne weitere Informationen zu sehen, die notwendigerweise wirft die eigentliche Baumstruktur aus. (Es muss mehr als einen Baum mit dem gleichen Satz von Elementen in der gleichen relativen Reihenfolge geben.)
Ich bin mir nicht sicher, was die minimale Abstraktion für Bäume wäre speziell, aber ich denke, der Kern Ihres Die Frage ist eigentlich ein bisschen breiter: Es wäre interessant zu sehen, welche minimale Menge an Information benötigt wird, um beliebige Fakten über einen Typ mit einer faltenartigen Funktion zu berechnen.
Um dies zu tun, müsste die eigentliche Hilfsfunktion in der Falte eine andere Art von Argument für jede Art von Datenstruktur nehmen. Dies führt uns natürlich zu Katamorphismen, die verallgemeinerte Falten über verschiedene Datentypen sind.
Sie können mehr über diese generalisierten Falten auf einer anderen Stack Overflow Frage lesen: What constitutes a fold for types other than list? (Im Interesse der Offenlegung/Eigenwerbung, schrieb ich eine der Antworten dort: P.)
Definieren Sie, was Sie mit "minimale Information" meinen. Ich denke, der Baum selbst ist so einfach wie es nur geht, für jede "Struktur mit Tiefe". – leftaroundabout
Ich mag diese Frage sehr. Vielleicht ist eine verwandte Frage: Gibt es etwas wie 'Traversable', das * sowohl * die' Alternative' als auch 'Applicative' Struktur des faltbaren' Functor' verwendet? –
(Ein paar weitere Details von dem, was ich denke: es wäre nicht schwer zu definieren 'data Depth a = Depth Nat' mit der offensichtlichen' Functor'-Instanz. Das 'Applicative'-Monoid könnte' (+, 0) 'und die' Alternative' one '(max, 0)'.) –