カテゴリ理論と抽象代数は、関数を他の関数と組み合わせる方法を扱います。複雑性理論は、関数の計算がいかに難しいかを扱います。これらの研究分野が自然なペアのように見えるので、これらの研究分野を組み合わせた人を見たことがありません。誰もこれをやったことがありますか?
やる気を起こさせる例として、モノイドを見てみましょう。操作がモノイドの場合、操作を並列化できることはよく知られています。
たとえば、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関数がない理由です。最適な実装は、モノイドの複雑さに依存します。
これらの2つのモノイドの違いを説明する便利な方法があるはずです。その後、これらの違いでコードに注釈を付け、モノイドの複雑さに応じて、使用する最適なアルゴリズムをプログラムが自動的に選択できるようにする必要があります。