書いていたら年が明けました。
前回の記事の補足など。
群っぽい多項式Functor
前回の記事のまとめ部分で次のようなことを書きました。
まとめると、モノイド
Ap F ()が群Gになるような多項式 ApplicativeFは、
- Functorとして
(G, E -> a)に自然同型- どれも曖昧なく以下のデータで表現できる
tr, tr' :: G -> E -> E,tr xは全単射でtr' xがその逆写像。- G-作用
act :: G -> E -> Edata F a = F G (E -> a) phi :: (G, G, G) -> E -> E phi (x,t,y) = tr' t . act y . tr (x <> t <> y) instance Applicative F where pure a = F mempty (const a) F x x_f <*> F y y_a = F xy (\i -> xy_f i (xy_a i)) where xy = x <> y xy_f = x_f . tr' x . act y . tr xy xy_a = y_a . tr' y . tr xy
改めてこの部分を読んでみると、Functorとしての(G, E -> a)への自然同型のとりかたを工夫すれば、
tr x = tr' x = idとなるようにできますね。なので、次のようにしたほうが簡潔でした。
モノイド
Ap F ()が群Gになるような多項式 ApplicativeFは、
Functorとして(G, E -> a)に自然同型- 自然同型のとりかたをうまく選べば、 どの
Fもある 左G-作用act :: G -> E -> Eによって以下のように定義される:data F a = F G (E -> a) instance Applicative F where pure a = F mempty (const a) F x x_f <*> F y y_a = F (x <> y) (\i -> x_f (act y i) (y_a i))
また、任意の群Hに対して、Ap F Hも再び群になります。
(<<>>) :: forall h. Semigroup h => F h -> F h -> F h
(<<>>) = liftA2 (<>)
-- (<<>>) = coerce ((<>) @(Ap F h))
mempty1 :: forall h. Monoid h => F h
mempty1 = pure mempty
-- mempty1 = coerce (mempty @(Ap F h))
inv1 :: forall h. Group h => F h -> F h
inv1 (F x x_a) = F x' (inv @h . x_a . act x')
where x' = inv @G x これが本当に群であることは、actが群作用であることから出ます。
x, x' :: G
x' = inv x
x_a :: E -> H
w :: F H
w = F x x_a
inv1 w = F x' (inv @H . x_a . act x')
w <<>> inv1 w
= liftA2 (<>) (F x x_a) (F x' (inv @H . x_a . act x'))
= F (x <> x') (\i -> x_a (act x' i) <> inv (x_a (act x' i)))
= F (x <> x') (\i -> let b = x_a (act x' i) in b <> inv b)
= F mempty (\i -> mempty)
= mempty1
inv1 w <<>> w
= liftA2 (<>) (F x' (inv @H . x_a . act x')) (F x x_a)
= F (x' <> x) (\i -> (inv . x_a . act x' . act x $ i) <> x_a i)
-- act x' . act x = act (x' <> x) = act mempty = id
= F mempty (\i -> inv (x_a i) <> x_a i)
= F mempty (\i -> mempty)
= mempty12つの群G,Hと群作用G -> E -> Eから新たな群を作るこの構成は、
群論の中ではズバリそのものがよく知られていて、輪積
という名前が付いています。(とえらそうに言いますが、私自身この補遺を書くまで気づいていませんでしたが。)
まとめると、
多項式Applicative Functorである
Fについて、次は同値Ap F ()が群であるFに同型なApplicativeF'としてF' a = (G, E -> a)が存在し、Gは群で、左G-作用act :: G -> E -> Eから定まるApplicative演算を持つ- 任意の群
Hについて、Ap F Hは群である。特に、G-作用を持つ集合E上のHの輪積になる。