La teoria delle categorie e l'algebra astratta affrontano il modo in cui le funzioni possono essere combinate con altre funzioni. La teoria della complessità si occupa di quanto sia difficile calcolare una funzione. È strano per me che non ho visto nessuno combinare questi campi di studio, poiché sembrano coppie così naturali. Qualcuno l'ha già fatto?
Come esempio motivante, diamo un'occhiata ai monoidi. È noto che se un'operazione è un monoide, possiamo parallelizzare l'operazione.
Ad esempio in Haskell, possiamo banalmente definire che l'addizione è un monoide sugli interi come questo:
instance Monoid Int where
mempty = 0
mappend = (+)
Ora se vogliamo calcolare la somma da 0 a 999, potremmo farlo in sequenza come:
foldl1' (+) [0..999]
o potremmo farlo in parallelo
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Ma parallelizzare questo monoide ha senso solo perché mappend viene eseguito a tempo costante. E se così non fosse? Gli elenchi, ad esempio, sono monoidi in cui mappend non esegue un tempo (o spazio) incostante. Immagino che questo sia il motivo per cui non esiste una funzione mconcat parallela predefinita in Haskell. La migliore implementazione dipende dalla complessità del monoide.
Sembra che ci dovrebbe essere un modo conveniente per descrivere le differenze tra questi due monoidi. Dovremmo quindi essere in grado di annotare il nostro codice con queste differenze e fare in modo che i programmi scelgano automaticamente i migliori algoritmi da utilizzare a seconda della complessità di un monoide.