プログラミング
Actegories
Actegories (bartoszmilewski.com)
要約
この記事では、プログラミング、特にレンズやオプティクスといった分野で中心的な役割を果たす「Actegories(アクテゴリー)」について解説しています。まず、テンソル積を持つ圏である「Monoidal Category(モノイダル圏)」の定義をHaskellでのモデリング例と共に説明し、次に、モノイダル圏のアクションをサポートする「Actegory」の概念とそのHaskellでの実装を紹介しています。さらに、同じモノイダル圏を使用するActegories間の射である「Monoidal Functor(モノイダルファンクター)」についても触れています。
全文翻訳
以前の記事: Double Categories における Kan Extension。
プログラミングにおいて、actegories は optics: lenses, prisms, traversals などで中心的な役割を果たします。actegories を理解するために、まず monoidal category の定義から始めましょう。
Monoidal Category
Monoidal category は、テンソル積を備えた category です。テンソル積は、 functor です。この積は、同型を除いて、結合的で単位元を持つと仮定します。これは、可逆な associator が存在することを意味します。これは、3つの引数すべてにおいて自然です。また、単位対象と2つの(可逆で自然な)unitor もあります。
これを Haskell で model してみることで、より良く理解できます。テンソル積の型 ten をパラメータ化し、それを Bifunctor とします。
class (Bifunctor ten) => MonoidalCategory ten where ...
Hask の部分 category を定義する標準的な方法は、制約を課すことによって object の型を制限することです。このような制限には特別な種類である Constraint があります。
class (Bifunctor ten) => MonoidalCategory (obj :: Type -> Constraint) ten where ...
このような制約の一般的な例は typeclass です。例えば Monoid は、category の object を monoid に制限します。(原理的には、arrow の型も monoid morphism に制限する必要があります。)
モノイダル category の単位を、ten でパラメータ化された関連型として指定できます。
type Unit ten :: Type
単位は category の object であるべきなので、制約を満たす必要があります。これを前置条件として定義にエンコードできます: obj (Unit ten)。これは循環参照につながりますが、言語プラグマ UndecidableSuperClasses を使用して克服できます。
class (Bifunctor ten , obj (Unit ten)) => MonoidalCategory (obj :: Type -> Constraint) ten where
type Unit ten :: Type
...
最後に、associator と unitor(およびそれらの逆)を追加できます。
class (Bifunctor ten , obj (Unit ten)) => MonoidalCategory (obj :: Type -> Constraint) ten where
type Unit ten :: Type
alpha :: (obj a, obj b, obj c) => (a `ten` b) `ten` c -> a `ten` (b `ten` c)
lambda :: (obj a) => (Unit ten) `ten` a -> a
...
これらの関数の型における obj 制約と、テンソルに対する中置記法に注意してください。
いくつかの例を考えてみましょう。最も簡単なのは、デカルト積をテンソル積とするすべての型の category です。
instance MonoidalCategory Hask (,) where
type Unit (,) = ()
alpha ((a, b), c) = (a, (b, c))
lambda ((), a) = a
...
Hask は空のクラスを使用して定義し、すべての object をそのインスタンスにします。
class Hask a
instance Hask a
同様に、Either をテンソル積とするモノイダル category、または object 制約として Monoid を持つモノイダル category を定義できます。
Actegory
Actegory は、モノイダル category のアクションをサポートする category です。これを、この category の object をモノイダル category の object で「乗算」または「スケーリング」すると考えることができます。(左)アクションは、積 category からへの functor として定義できます。または、currying した後、から endofunctor category への functor として定義できます。
coherency conditions は、アクションとテンソル積およびその単位を関連付ける可逆な自然変換です。
アクションは両方の引数で functorial であるため、Haskell の翻訳では、簡単のために Bifunctor として扱います。(Profunctor アクションも可能です。圏論的には、モノイダル category としてを使用することに対応します。)
class (MonoidalCategory obj ten, Bifunctor act) => Actegory obj ten act | act -> ten where
assoc :: (obj m, obj n) => (m `ten` n) `act` a -> m `act` (n `act` a)
assoc' :: (obj m, obj n) => m `act` (n `act` a) -> (m `ten` n) `act` a
unit :: Unit ten `act` a -> a
unit' :: a -> Unit ten `act` a
もう一つの単純化の仮定は、アクションがテンソル積を一意に識別することです。これはここでは関数的依存関係 act -> ten としてエンコードされています。
actegory の最も簡単な例は、デカルト積の自己アクションです。ここでは、モノイダル category がそれ自体に作用します。
instance Actegory Hask (,) (,) where
assoc ((m, n), a) = (m, (n, a))
assoc' (m, (n, a)) = ((m, n), a)
unit ((), a) = a
unit' a = ((), a)
Monoidal Functors
それらのアクションに同じモノイダル category を使用する Actegories は、category を形成します。この category の射は(厳密な)monoidal functors です。これらは、あるアクションを別のものにマッピングする functors です。
Haskell では、次のように model できます。
class (Actegory obj ten act1, Actegory obj ten act2, Functor f) => MonFunctor obj ten act1 act2 f where
as :: obj m => m `act2` f a -> f (m `act1` a)
as' :: obj m => f (m `act1` a) -> m `act2` f a
実際、actegories は bicategory を形成し、アクションを保持する自然変換が monoidal functors の間で作用します。
以下は、非自明な actegories 間の monoidal functor の興味深い例です。
instance (Traversable f) => MonFunctor Monoid (,) (,) (,) f where
as (m, fa) = fmap (m, ) fa
as' = sequenceA
Haskell コードはここで入手可能です。共有する: Reddit で共有 (新規ウィンドウで開きます) Reddit その他 X で共有 (新規ウィンドウで開きます) X LinkedIn で共有 (新規ウィンドウで開きます) LinkedIn Facebook で共有 (新規ウィンドウで開きます) Facebook 友人へのリンクをメールで送信 (新規ウィンドウで開きます) Email これのような:いいね読み込み中…関連返信を残す返信をキャンセルアーカイブされたエントリ投稿日: 2026年6月30日 午前4時45分カテゴリ: Category Theory, Haskellタグ: Actegories, Category Theory, Haskell, Lens, Opticsもっと見る: 返信を残すか、自分のサイトからトラックバックできます。WordPress.com 提供。Bartosz Milewski's Programming Cafe の詳細を発見する今すぐ購読して読み続け、全アーカイブにアクセスしてください。メールアドレスを入力…購読する続きを読む %d