Kategorietheorie und abstrakte Algebra befassen sich mit der Art und Weise, wie Funktionen mit anderen Funktionen kombiniert werden können. Die Komplexitätstheorie befasst sich damit, wie schwer eine Funktion zu berechnen ist. Es ist seltsam für mich, dass ich niemanden gesehen habe, der diese Studienbereiche kombiniert, da sie wie solche natürlichen Paare aussehen. Hat das schon mal jemand gemacht?
Schauen wir uns als motivierendes Beispiel Monoide an. Es ist allgemein bekannt, dass wir die Operation parallelisieren können, wenn eine Operation ein Monoid ist.
Zum Beispiel können wir in Haskell trivial definieren, dass Addition ein Monoid über den ganzen Zahlen ist:
instance Monoid Int where
mempty = 0
mappend = (+)
Wenn wir nun die Summe von 0 bis 999 berechnen möchten, können wir dies der Reihe nach tun:
foldl1' (+) [0..999]
oder wir könnten es parallel tun
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Die Parallelisierung dieses Monoids ist jedoch nur deshalb sinnvoll, weil mappend in konstanter Zeit ausgeführt wird. Was wäre, wenn dies nicht der Fall wäre? Listen sind z. B. Monoide, bei denen mappend nicht zeitlich (oder räumlich!) Inkonstant abläuft. Ich vermute, aus diesem Grund gibt es in Haskell keine standardmäßige parallele mconcat-Funktion. Die beste Implementierung hängt von der Komplexität des Monoids ab.
Es scheint, als gäbe es eine bequeme Möglichkeit, die Unterschiede zwischen diesen beiden Monoiden zu beschreiben. Wir sollten dann in der Lage sein, unseren Code mit diesen Unterschieden zu versehen und die Programme automatisch die besten Algorithmen auswählen zu lassen, die je nach Komplexität eines Monoids verwendet werden.