Teoria kategorii i algebra abstrakcyjna zajmują się sposobem łączenia funkcji z innymi funkcjami. Teoria złożoności dotyczy tego, jak trudna jest funkcja do obliczenia. Dziwne jest dla mnie to, że nie widziałem, aby ktoś łączył te kierunki studiów, ponieważ wydają się one takimi naturalnymi parami. Czy ktoś już to zrobił?
Jako motywujący przykład przyjrzyjmy się monoidom. Dobrze wiadomo, że jeśli operacja jest monoidem, wówczas możemy ją zrównoleglić.
Na przykład w Haskell możemy w trywialny sposób zdefiniować, że dodanie jest monoidą nad liczbami całkowitymi w następujący sposób:
instance Monoid Int where
mempty = 0
mappend = (+)
Teraz, jeśli chcemy obliczyć sumę od 0 do 999, moglibyśmy to zrobić sekwencyjnie:
foldl1' (+) [0..999]
lub moglibyśmy to zrobić równolegle
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Ale równoległość tej monoidy ma sens tylko dlatego, że mappend działa w stałym czasie. Co by było, gdyby tak nie było? Listy, na przykład, są monoidami, w których mappend nie działa przez dłuższy czas (lub spację!). Zgaduję, że właśnie dlatego w Haskell nie ma domyślnej równoległej funkcji mconcat. Najlepsza implementacja zależy od złożoności monoidu.
Wydaje się, że powinien istnieć wygodny sposób na opisanie różnic między tymi dwoma monoidami. Powinniśmy wtedy być w stanie opatrzyć adnotacje naszym kodem tymi różnicami, a programy powinny automatycznie wybierać najlepsze algorytmy do zastosowania w zależności od złożoności monoidu.