Ho cercato di leggere “ Pearls of Functional Algorithm design ”, e successivamente “ The Algebra of Programming ”, e c'è un'ovvia corrispondenza tra tipi di dati definiti ricorsivamente (e polinomialmente) e oggetti combinatori, con la stessa definizione ricorsiva e successivamente leader alle stesse serie di potenze formali (o funzioni generatrici), come mostrato nelle introduzioni alle specie combinatorie (ho letto " Specie e fattori e tipi, oh mio! ").
Quindi, per la prima domanda, c'è un modo per recuperare l'equazione di generazione (ricorsiva) dalle serie di potenze? Questo è un ripensamento però.
Mi interessava di più l'idea di algebre iniziali e di algebre finali come tipo di "definizione delle procedure sulla struttura dei dati". Ci sono alcune regole pratiche nella programmazione funzionale, riguardanti la composizione, i prodotti di mappatura tra algebre e simili, descritte ad esempio in questo tutorial. Mi sembra che questo potrebbe essere un modo abbastanza potente per affrontare la complessità e, ad esempio, sembra abbastanza semplice recuperare il teorema del Maestro in tale contesto (voglio dire, devi fare lo stesso argomento, quindi non molto guadagno in questo caso), e il catamorfismo unico dell'algebra iniziale e il fatto (sbaglio?) che le algebre tra A e FA per il funzione polinomiale F sono isomorfi, mi fa pensare che tale approccio possa avere molti benefici nell'analizzare la complessità di operazioni su strutture dati.
Dal punto di vista pratico, sembra che le regole di fusione (fondamentalmente, i modi per comporre morfismi algebrici tra loro, morfismi coalgebra e morfismi generali) siano una tecnica di ottimizzazione molto potente per la trasformazione e il refactoring del programma. Ho ragione nel pensare che il pieno utilizzo di queste regole possa produrre un programma ottimale (nessuna struttura di dati intermedia non necessaria o altre operazioni extra).
Sono su qualcosa (e cosa) qui? È beneficiario (dal punto di vista dell'apprendimento) cercare di considerare la complessità computazionale in questo modo? Le strutture, per le quali possiamo avere algebre iniziali "carine", sono in qualche modo troppo limitate per alcuni problemi?
Sto principalmente cercando di trovare un modo di pensare alla complessità in termini di struttura dello spazio di ricerca e il modo in cui lo "spazio di ricerca" e l '"algoritmo di ricerca" interagiscono attraverso alcuni oggetti "belli" come l'algebra iniziale del funzione e per capire se è utile provare a vedere le cose in questo modo, quando si guardano strutture più complicate.