A teoria das categorias e a álgebra abstrata lidam com a maneira como as funções podem ser combinadas com outras funções. A teoria da complexidade lida com a dificuldade de calcular uma função. É estranho para mim não ter visto ninguém combinar esses campos de estudo, pois eles parecem pares naturais. Alguém já fez isso antes?
Como um exemplo motivador, vamos dar uma olhada nos monoides. É sabido que, se uma operação é monóide, podemos paralelizar a operação.
Por exemplo, em Haskell, podemos definir trivialmente que a adição é um monóide sobre números inteiros como este:
instance Monoid Int where
mempty = 0
mappend = (+)
Agora, se quisermos calcular a soma de 0 a 999, poderíamos fazê-lo sequencialmente como:
foldl1' (+) [0..999]
ou poderíamos fazê-lo em paralelo
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Mas paralelizar esse monóide só faz sentido porque o mappend é executado em tempo constante. E se não fosse esse o caso? As listas, por exemplo, são monoides onde o mappend não executa um tempo inconstante (ou espaço!). Eu estou supondo que é por isso que não há nenhuma função mconcat paralela padrão no Haskell. A melhor implementação depende da complexidade do monóide.
Parece que deve haver uma maneira conveniente de descrever as diferenças entre esses dois monóides. Deveríamos, então, poder anotar nosso código com essas diferenças e fazer com que os programas escolham automaticamente os melhores algoritmos para usar, dependendo da complexidade de um monóide.