Теорія категорій та абстрактна алгебра мають справу з тим, як функції можна поєднувати з іншими функціями. Теорія складності стосується того, наскільки важкою є функція для обчислення. Мені це дивно, що я не бачив, щоб хтось поєднував ці напрями вивчення, оскільки вони здаються такими природними парами. Хтось робив це раніше?
Як мотивуючий приклад, давайте подивимося на моноїди. Добре відомо, що якщо операція є моноїдом, то ми можемо паралелізувати операцію.
Наприклад, у 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. Найкраща реалізація залежить від складності моноїда.
Здається, що повинен бути зручний спосіб описати відмінності між цими двома моноїдами. Тоді ми повинні мати можливість коментувати наш код цими відмінностями, і програма автоматично вибирає найкращі алгоритми для використання залежно від складності моноїда.