私はこれらのテーマの専門家であるとは主張していませんが、この考えに光を当てることができるかもしれません.
まず、圏論について考えてみましょう。圏論は、非常に高いレベルでの数学的構造の研究です。カテゴリの概念は非常に一般的であり、非常に多くの数学的オブジェクトがカテゴリを形成します。圏論は当初、信じられないほど純粋で抽象的であると考えられていましたが、これらはしばしば数学で行われるため、コンピューター サイエンスや量子力学などの応用分野で多くの用途があることが判明しました。モナドは、関数型プログラムのセマンティクスについて推論する際に非常に役立つことが判明しました。関数型プログラムは一般に表示形式で表現されます (したがって、計算にいかなる種類の順序も強制せず、結果だけを求めます)。このことから、モナドも非常に優れた設計パターンであることもわかりました関数型プログラムを書くためのものであり、その有用性により、Haskell の設計 (do 記法など) で非常に目立つようになりました。ファンクター、アプリカティブ、モノイドはすべて、モナドよりも強力ではないが、よりアプリカティブなオブジェクトとして後に続きました (しゃれは意図されていません!)。
ただし、圏論はこの種の構造をより一般的な方法で研究し、数学 (および物理学など) の多くの分野に関連することが判明しています。専門家ではないので、これがどれだけ複雑性理論に関連するかはすぐにはわかりませんが、試してみましょう。
複雑性理論は、計算の実現可能性に関係しています。チューリングなどは、一般には計算できない関数がいくつかあることを示しました (たとえば、停止問題、ビジー ビーバー問題など) が、特定の計算が原則としてどれほど簡単かという問題は、一般に難しい問題です。おそらくご存じのとおり、アルゴリズム (チューリング マシンとして表すことができます) は、漸近的な実行時間に基づいて複雑さのクラスに分類できます。非常に多くの複雑性クラスが特定されていますが ( The Complexity Zooを参照)、これらのクラスの構造についてはほとんど知られていません。有名なP = NP問題は、複雑さを推論することがいかに難しいかを示しています。
複雑性クラスの性質と、それらの間の関係を証明することがどれほど難しいかについての直感から、複雑性クラス内にカテゴリを確立するのは難しいと思っていました。明らかに、チューリング マシンのセットはカテゴリを形成しますが、O(n) のマシンのセットは? または P のマシンのセット? これは、複雑さの専門家にとって良い研究の方向性かもしれませんが、そうではないかもしれません! 個人的には、もっと頑張らないとなんとも言えません。
次に、モノイド内の複雑さと並列化戦略の例を考えてみましょう。この 2 番目のセクションが最初のセクションとほとんど関係がないように思われる場合、それは、これらが非常に異なる概念であると考えているためです。1 つ目はカテゴリと複雑さの数学、2 つ目は特定の設計パターン内でのアルゴリズムの並列化の詳細です。
特定のタイプがモノイドであることがわかっている場合、それを扱う複雑さについてどのような理由が考えられるでしょうか? これはからのクラス定義ですData.Monoid
class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat :: [a] -> a
mconcat = foldr mappend mempty
もちろん、あなたが推測したように、私たちが知っているのは型だけなので、複雑さについては何も言えません。mconcat
ドキュメントには、 Data.Monoid 内のデフォルトの実装について次のように書かれています。
-- ^ Fold a list using the monoid.
-- For most types, the default definition for 'mconcat' will be
-- used, but the function is included in the class definition so
-- that an optimized version can be provided for specific types.
私が言おうとしている点mconcat
は、他の操作の複雑さから必ずしも一般化できるわけではないということです。多くの場合、より高速なアルゴリズムが存在しないことを証明することは困難です。mconcat
このような場合、手動で実装できます。
また、並列戦略を自動的に定義することにも言及しています。Haskell では確かにさまざまな戦略を定義できますが、そのうちの多くの有用なものは既にControl.Parallel.Strategies
. たとえば、parList は、リストのすべての要素に並行して戦略を適用します。
parList :: Strategy a -> Strategy [a]
parList strat [] = ()
parList strat (x:xs) = strat x `par` (parList strat xs)
これから、並列マップ関数を定義できます。
parMap :: Strategy b -> (a -> b) -> [a] -> [b]
parMap strat f xs = map f xs `using` parList strat
using :: a -> Strategy a -> a
using x s = s x `seq` x
これにより、実装と並列化を分離できることに注意してください。この種の概念は、特に個々のアルゴリズムの複雑さを説明する注釈から簡単に自動化できるとは思いません。
要約すると、圏論は将来の複雑さの研究に役立つツールになる可能性があります。しかし、これが並列化戦略の自動生成につながる可能性は低いと思います。