Теория категорий и абстрактная алгебра связаны с тем, как функции могут быть объединены с другими функциями. Теория сложности относится к тому, как сложно вычислить функцию. Странно, что я не видел, чтобы кто-нибудь сочетал эти области исследований, поскольку они кажутся такими естественными парами. Кто-нибудь сделал это раньше?
В качестве мотивирующего примера рассмотрим моноиды. Хорошо известно, что если операция является моноидом, то мы можем распараллелить операцию.
Например, в 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 по умолчанию. Наилучшая реализация зависит от сложности моноида.
Кажется, должен быть удобный способ описать различия между этими двумя моноидами. Затем мы должны уметь комментировать наш код с этими различиями и иметь программы, автоматически выбирающие наилучшие алгоритмы для использования в зависимости от сложности моноида.