La teoría de categorías y el álgebra abstracta tratan la forma en que las funciones se pueden combinar con otras funciones. La teoría de la complejidad trata de cuán difícil es calcular una función. Es extraño para mí que no haya visto a nadie combinar estos campos de estudio, ya que parecen pares tan naturales. ¿Alguien ha hecho esto antes?
Como ejemplo motivador, echemos un vistazo a los monoides. Es bien sabido que si una operación es un monoide, entonces podemos paralelizar la operación.
Por ejemplo, en Haskell, podemos definir trivialmente que la suma es un monoide sobre los enteros como este:
instance Monoid Int where
mempty = 0
mappend = (+)
Ahora, si queremos calcular la suma de 0 a 999, podríamos hacerlo secuencialmente como:
foldl1' (+) [0..999]
o podríamos hacerlo en paralelo
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Pero paralelizar este monoide tiene sentido solo porque mappend se ejecuta en tiempo constante. ¿Y si este no fuera el caso? Las listas, por ejemplo, son monoides donde mappend no ejecuta un tiempo inconstante (¡o espacio!). Supongo que es por eso que no hay una función mconcat paralela predeterminada en Haskell. La mejor implementación depende de la complejidad del monoide.
Parece que debería haber una manera conveniente de describir las diferencias entre estos dos monoides. Entonces deberíamos poder anotar nuestro código con estas diferencias y hacer que los programas elijan automáticamente los mejores algoritmos para usar según la complejidad de un monoide.