Ho una struttura in stile schema di ricorsione e vorrei ottenere un elenco di tutte le sottostrutture inclusa la struttura completa, ovvero l'equivalente di ciò che fa la funzione tails
su un List
. Penso che sarebbe possibile implementarlo chiamando lo para
, mappando di nuovo alla struttura originale ad ogni passaggio, e poi attaccando separatamente la struttura originale sul davanti, ma ciò sembra molto ingombrante: (non verificato, scuse se Haskell non è corretto; scritta in termini di Mu
come non ho davvero capito l'ancora Base
costrutto)Generalizzazione schemi di ricorsione di `code '
gtails :: Functor f => Mu f -> [Mu f]
gtails = para (\a -> (fmap fst a) : (foldMap snd a))
(vale a dire nel caso f=Prim
questo è tails
, per altri f
è una generalizzazione)
c'è un modo più bello ? Mi rendo conto che questo non è poi così male, ma il fmap fst a
per recuperare la struttura "originale" in quel passaggio è piuttosto ingombrante e lo foldMap snd a
è qualcosa che trovo ripetuto molto quando uso para
(allo stesso modo che si sente di nuovo come dovrebbe essere inutile).
ho bisogno di una versione in termini di ricorsione-sistemi perché il mio caso reale non è 'List' ma una struttura in stile schemi di ricorsione. AIUI gli schemi di ricorsione 'para' è' para :: Foldable t => (Base t (t, a) -> a) -> t -> a' che non ha il parametro 'b' dal tuo esempio. Puoi dare una versione in termini di questo 'para' (o altro codice di schemi di ricorsione) che è' tails' se lo chiamiamo con 'tfa = Maybe (a, f)' (nel senso che 'Base t' è quindi isomorfo a 'List', a meno che non mi sbagli) ma possa anche essere chiamato con altri' t'? – lmm
@lmm Vedi modifica; Spero che questo sia ciò che intendevi. –
'Prim' sembra essere una cosa specifica di List', mentre io voglio una versione che funzioni per strutture di dati non-list, e non penso che necessariamente potrei sempre definire un' Base t ~ Prim [a] ' ? La funzione a cui sto pensando non dovrebbe richiedere ulteriori vincoli: ho aggiornato la domanda con un'implementazione che ritengo sarebbe valida (ma che mi aspetterei sia una funzione standard, o almeno più concisa della mia versione). – lmm