書いていたら年が明けました。
前回の記事の補足など。
群っぽい多項式Functor
前回の記事のまとめ部分で次のようなことを書きました。
まとめると、モノイド
Ap F ()
が群G
になるような多項式 ApplicativeF
は、
- Functorとして
(G, E -> a)
に自然同型- どれも曖昧なく以下のデータで表現できる
tr, tr' :: G -> E -> E
,tr x
は全単射でtr' x
がその逆写像。- G-作用
act :: G -> E -> E
data F a = F G (E -> a) phi :: (G, G, G) -> E -> E = tr' t . act y . tr (x <> t <> y) phi (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 = x <> y xy = x_f . tr' x . act y . tr xy xy_f = y_a . tr' y . tr xy xy_a
改めてこの部分を読んでみると、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
= pure mempty
mempty1 -- mempty1 = coerce (mempty @(Ap F h))
inv1 :: forall h. Group h => F h -> F h
F x x_a) = F x' (inv @h . x_a . act x')
inv1 (where x' = inv @G x
これが本当に群であることは、act
が群作用であることから出ます。
x' :: G
x,= inv x
x'
x_a :: E -> H
w :: F H
= F x x_a
w = F x' (inv @H . x_a . act x')
inv1 w
<<>> inv1 w
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
<<>> w
inv1 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)
= mempty1
2つの群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
の輪積になる。