Ich habe eine Rekursionschemas Stil Struktur und ich möchte eine Liste aller Unterstrukturen einschließlich der vollständigen Struktur erhalten - dh das Äquivalent von dem, was die tails
Funktion auf einem List
tut . Ich denke, es wäre möglich, dies zu implementieren, indem man para
aufruft, in jedem Schritt auf die ursprüngliche Struktur zurückverwandelt und dann die ursprüngliche Struktur auf der Vorderseite separat klebt, aber das scheint sehr beschwerlich: (ungetestet, Entschuldigung, wenn der Haskell falsch ist; geschrieben in Bezug auf Mu
, da ich nicht wirklich das Base
Konstrukt noch) nicht verstanden habenRekursionschemata Generalisierung von `tails`
gtails :: Functor f => Mu f -> [Mu f]
gtails = para (\a -> (fmap fst a) : (foldMap snd a))
(dh im Falle f=Prim
dies tails
, ist es für andere f
ist eine Verallgemeinerung)
gibt es eine schönere Art und Weise ? Ich weiß, das ist nicht so schlimm, aber die fmap fst a
, um die "ursprüngliche" Struktur bei diesem Schritt wiederherzustellen fühlt sich ziemlich umständlich, und die foldMap snd a
ist etwas, das ich mich wiederhole viel bei der Verwendung para
(ebenfalls fold a
bei der Verwendung cata
, die wieder wie fühlt es sollte unnötig sein).
Ich brauche eine Version in Bezug auf die Rekursion-Systeme weil mein tatsächlicher Fall nicht "List" ist, sondern eine Rekursionschemas-Stilstruktur. AIUI die Rekursionschemata 'para' ist' para :: Faltbar t => (Basis t (t, a) -> a) -> t -> a', die nicht den 'b'-Parameter von Ihrem Beispiel hat. Können Sie eine Version in Bezug auf diesen 'para' (oder einen anderen Rekursionschemata-Code) geben, der' tails' ist, wenn wir ihn mit 'tfa = Maybe (a, f)' (in dem Sinne, dass 'Base t' ist) bezeichnen dann isomorph zu 'List', außer ich täusche mich, aber kann auch mit anderem' t' aufgerufen werden? – lmm
@lmm Siehe Bearbeiten; Ich hoffe, das hast du gemeint. –
'Prim 'scheint eine' List'-spezifische Sache zu sein, während ich eine Version möchte, die für Nicht-Listen-Datenstrukturen funktioniert, und ich glaube nicht, dass ich notwendigerweise immer eine' Basis t ~ Prim [a] 'definieren könnte ? Die Funktion, an die ich denke, sollte keine zusätzlichen Einschränkungen benötigen - ich habe die Frage mit einer Implementierung aktualisiert, die meiner Meinung nach gültig sein würde (aber von der ich erwarte, dass sie eine Standardfunktion ist oder zumindest prägnanter als meine Ausführung). – lmm