Kategori teori dan aljabar abstrak berhubungan dengan cara fungsi dapat dikombinasikan dengan fungsi lainnya. Teori kompleksitas berkaitan dengan seberapa sulit suatu fungsi dikomputasi. Aneh bagi saya bahwa saya belum pernah melihat orang yang menggabungkan bidang studi ini, karena mereka tampak seperti pasangan alami. Adakah yang pernah melakukan ini sebelumnya?
Sebagai contoh yang memotivasi, mari kita lihat monoids. Sudah diketahui bahwa jika suatu operasi adalah monoid, maka kita dapat memparalelkan operasi tersebut.
Sebagai contoh di Haskell, kita dapat dengan sepele mendefinisikan bahwa penambahan adalah monoid di atas bilangan bulat seperti ini:
instance Monoid Int where
mempty = 0
mappend = (+)
Sekarang jika kita ingin menghitung jumlah 0 hingga 999, kita dapat melakukannya secara berurutan seperti:
foldl1' (+) [0..999]
atau kita bisa melakukannya secara paralel
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Tetapi memparalelkan monoid ini masuk akal hanya karena pemetaan berjalan dalam waktu yang konstan. Bagaimana jika ini bukan masalahnya? Daftar, misalnya, adalah monoids di mana mappend tidak menjalankan waktu tidak konstan (atau spasi!). Saya menduga inilah sebabnya tidak ada fungsi paralel standar mconcat di Haskell. Implementasi terbaik tergantung pada kompleksitas monoid.
Sepertinya harus ada cara yang mudah untuk menggambarkan perbedaan antara kedua monoids ini. Kami kemudian dapat membuat anotasi kode kami dengan perbedaan-perbedaan ini dan membuat program secara otomatis memilih algoritma terbaik untuk digunakan tergantung pada kompleksitas monoid.