Теория категорий и абстрактная алгебра имеют дело со способом, которым функции могут быть объединены с другими функциями. Теория сложности имеет дело с тем, насколько сложно вычислить функцию. Мне странно, что я не видел, чтобы кто-нибудь совмещал эти области изучения, поскольку они кажутся такими естественными парами. Кто-нибудь делал это раньше?
В качестве мотивирующего примера давайте рассмотрим моноиды. Хорошо известно, что если операция является моноидом, то мы можем распараллелить операцию.
Например, в Haskell, мы можем тривиально определить, что сложение является моноидом над целыми числами, например так:
instance Monoid Int where
mempty = 0
mappend = (+)
Теперь, если мы хотим вычислить сумму от 0 до 999, мы можем сделать это последовательно:
foldl1' (+) [0..999]
или мы могли бы сделать это параллельно
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Но распараллеливание этого моноида имеет смысл только потому, что mappend работает в постоянном времени. Что если бы это было не так? Например, списки - это моноиды, в которых mappend не запускает непостоянное время (или пространство!). Я предполагаю, что именно поэтому в Haskell нет функции параллельного mconcat по умолчанию. Наилучшая реализация зависит от сложности моноида.
Кажется, должен быть удобный способ описать различия между этими двумя моноидами. Затем мы должны иметь возможность комментировать наш код с этими различиями и иметь программы автоматически выбирать лучшие алгоритмы для использования в зависимости от сложности моноида.