Lý thuyết thể loại và đại số trừu tượng đối phó với cách các hàm có thể được kết hợp với các hàm khác. Lý thuyết phức tạp liên quan đến việc một hàm khó tính như thế nào. Thật kỳ lạ với tôi rằng tôi chưa thấy ai kết hợp các lĩnh vực nghiên cứu này, vì chúng có vẻ giống như những cặp tự nhiên như vậy. Có ai làm điều này trước khi?
Để làm ví dụ động lực, chúng ta hãy nhìn vào các đơn sắc. Người ta biết rằng nếu một hoạt động là một đơn thức, thì chúng ta có thể song song hoạt động.
Ví dụ: trong Haskell, chúng ta có thể định nghĩa một cách tầm thường rằng phép cộng là một đơn thức trên các số nguyên như thế này:
instance Monoid Int where
mempty = 0
mappend = (+)
Bây giờ nếu chúng ta muốn tính tổng từ 0 đến 999, chúng ta có thể thực hiện tuần tự như sau:
foldl1' (+) [0..999]
hoặc chúng ta có thể làm điều đó song song
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
Nhưng song song với monoid này chỉ có ý nghĩa vì mappend chạy trong thời gian không đổi. Điều gì xảy ra nếu đây không phải là trường hợp? Danh sách, ví dụ, là các đơn sắc trong đó mappend không chạy theo thời gian (hoặc không gian!). Tôi đoán đây là lý do tại sao không có chức năng mconcat song song mặc định trong Haskell. Việc thực hiện tốt nhất phụ thuộc vào độ phức tạp của monoid.
Có vẻ như nên có một cách thuận tiện để mô tả sự khác biệt giữa hai đơn sắc này. Sau đó, chúng tôi sẽ có thể chú thích mã của chúng tôi với những khác biệt này và để các chương trình tự động chọn các thuật toán tốt nhất để sử dụng tùy thuộc vào độ phức tạp của một monoid.