このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

関手・自然変換のカリー化

関数はカリー化できて、それは便利な道具になります。同様に、関手をカリー化することができます。関手のカリー化は割とお馴染みかも知れません。それだけでなく、自然変換もカリー化することができます。$`\newcommand{\cat}[1]{\mathcal{#1}}
%\newcommand{\Imp}{ \Rightarrow }
\newcommand{\In}{ \text{ in } }
\newcommand{\mrm}[1]{\mathrm{#1}}
%\newcommand{\op}{\mathrm{op}}
%\newcommand{\id}{\mathrm{id}}
\newcommand{\hyp}{\text{-}}
\newcommand{\twoto}{\Rightarrow}
%\newcommand{\dimU}[2]{{#1}\!\updownarrow^{#2}}
%\newcommand{\Iff}{\Leftrightarrow}
\newcommand{\For}{\text{For } }
\newcommand{\lto}{\leftarrow }
`$

内容:

自然変換、成分、自然性

記法〈書き方〉ってのは習慣と好みの問題なので、なんだっていいっちゃナンダッテイイのだけど、広く採用されている習慣が、自分の好みとあわないときは不愉快で、精神衛生上よろしくないですね。自然変換の成分を $`\alpha_A`$ と書くの、あれはイヤッ!

普通に $`\alpha(A)`$ と書けば、関手と自然変換に同時に引数を渡すときに形が揃います。

$`\quad \alpha :: F \twoto G : \cat{C} \to \cat{D} \In {\bf CAT}\\
\For A \in |\cat{C}|\\
\quad \alpha(A) : F(A) \to G(A) \In \cat{D}
`$

もちろん、他の引数渡し形式を使ってもいいです(下の箇条書き)。

  • $`\alpha[A]`$
  • $`\alpha A`$
  • $`A. \alpha`$

自然変換〈2-射〉と関手〈1-射〉への引数渡し形式を揃えたほうがいいだろう、が趣旨なので、次でもいいです。

$`\quad \alpha :: F \twoto G : \cat{C} \to \cat{D} \In {\bf CAT}\\
\For A \in |\cat{C}|\\
\quad \alpha_A : F_A \to G_A \In \cat{D}
`$

それと、$`\alpha(A)`$ だけじゃなくて、$`\alpha(f)`$ も使うと便利。ただし、$`\alpha(f)`$ の解釈はニ通りあるけど。

まず、圏(高次圏を含む)のk-射の集合を $`|\cat{C}|_k`$ と書くことにして、関手と自然変換の次元ごとの構成素(素材)を列挙してみます。(変換手〈transfor〉については、例えば「「モナド、双圏、変換手」への補遺」参照。「コンストラクタ系と変換手性 」にも関連する話題あり。)

関手 = 1-射 = 0-変換手 $`F`$

  1. $`F_0 : |\cat{C}|_0 \to |\cat{D}|_0`$ (関手の対象パート)
  2. $`F_1 : |\cat{C}|_1 \to |\cat{D}|_1`$ (関手の射パート)

自然変換 = 2-射 = 1-変換手 $`\alpha`$

  1. $`\alpha_0 : |\cat{C}|_0 \to |\cat{D}|_1`$ (自然変換の対象パート = 成分)
  2. $`\alpha_1 : |\cat{C}|_1 \to |\cat{D}|_2`$ (自然変換の射パート)

自然変換の射パート〈morphism part〉って何よ? となりますが、圏 $`\cat{C}`$ の1-射に圏 $`\cat{D}`$ の2-射を対応させます。2-射とは、1-射のあいだの等式、つまり自然性のことです。

$`\alpha :: F \twoto G : \cat{C} \to \cat{D} \In {\bf CAT}\\
\For f: A \to B \In \cat{C}\\
\quad \alpha_1(f) :: \alpha_0(A); G_1(f) \twoto F_1(f);\alpha_0(f):F_0(A) \to G_0(B) \In \cat{D}
`$

図式的に表現すれば:

$`\require{AMScd}
\quad \alpha \text{'s naturality for } f\\
\:\\
= \left(
\begin{CD}
F_0(A) @>{\alpha_0(A)}>> G_0(A)\\
@V{F_1(f)}VV @VV{G_1(f)}V\\
F_0(B) @>{\alpha_0(B)}>> G_0(B)\\
\end{CD}
\right) \text{'s commutativity }\\
\:\\
= \left( \alpha_0(A); G_1(f) \text{ and } F_1(f);\alpha_0(f):F_0(A) \right) \text{'s equality}
`$

任意の $`f\in |\cat{C}|_1`$ に対して、等式 $`\alpha_1(f) \in |\cat{D}|_2`$ が成立することから、可換四角形〈自然性〉の対角線である1-射が定義できます。それを次のように書きましょう。

$`\For f: A \to B \In \cat{C}\\
\quad \bar{\alpha}(f) := \alpha_0(A); G_1(f) : F_0(A) \to G_0(B) \In \cat{D}\\
\text{Or}\\
\quad \bar{\alpha}(f) := F_1(f);\alpha_0(f) : F_0(A) \to G_0(B) \In \cat{D}
`$

2つの定義のどちらでもいいことは、等式 $`\alpha_1(f)`$ で保証されます。

等式〈2-射〉 $`\alpha_1(f)`$ と1-射 $`\bar{\alpha}(f)`$ のどちらも $`\alpha(f)`$ と書いてしまってもいいでしょう。すると、$`\alpha`$ は次の意味でオーバーロードされます。

  1. $`A \mapsto (\alpha(A):F(A) \to G(A))`$ (0-射 → 1-射)
  2. $`f \mapsto (\alpha(f):: \alpha(A); G(f) \twoto F(f);\alpha(f))`$ (1-射 → 2-射)
  3. $`f \mapsto (\alpha(f): F(A) \to G(B) )`$ (1-射 → 1-射)

三番目の用法は、ストリング図において次の形で多用されます。(例えば、「絵算をはじめた人への注意」参照。)

$`\quad
\xymatrix{
A \ar@{-}[d]
& F \ar@{-}[d]
\\
(f) \ar[d]
& (\alpha) \ar[d]
\\
B & G
}\\
f.\alpha : A.F \to B.G
`$

ストリング図内で、エレベーター法則でノードを上下スライドさせてもいいことは、等式(ストリング図書き換え)としての $`f.\alpha`$ で表現されます。

関手のカリー化

関手のカリー化は、関数のカリー化と同じことで、二項関手〈双関手〉を関手値関手に変換することです。左カリー化と右カリー化を区別しましょう。それにともない、左指数と右指数も区別します。

  • 左指数: $`[\cat{C}, \cat{E}] = [\cat{C} \to \cat{E}] = {^\cat{C} \cat{E}}`$
  • 右指数: $`[\cat{E} \lto \cat{D}] = \cat{E}^\cat{D}`$

左カリー化を $`{^\cap \hyp}`$ 、右カリー化を $`{\hyp^\cap }`$ で表します(象形文字記法)。

$`\quad F: \cat{C}\times \cat{D} \to \cat{E} \In {\bf CAT}\\
\quad {^\cap F}: \cat{D} \to [\cat{C} \to \cat{E}] = {^\cat{C}\cat{E}}\In {\bf CAT}\\
\quad { F^\cap}: \cat{C} \to [\cat{E} \lto \cat{D} ] = \cat{E}^\cat{D} \In {\bf CAT}
`$

左カリー化した関手への引数渡しは上付き添字、右カリー化した関手への引数渡しは下付き添字とします。

$`\For X, Y\in |\cat{D}|\\
\quad (^\cap F)^X, (^\cap F)^Y \in |[\cat{C} \to \cat{E}]|\\
\For g: X \to Y \in |\cat{D}|\\
\quad (^\cap F)^g : (^\cap F)^X \to (^\cap F)^Y \In [\cat{C} \to \cat{E}]\\
\:\\
\For A, B\in |\cat{C}|\\
\quad ( F^\cap)_A, ( F^\cap)_B \in |[\cat{E} \lto \cat{D} ]|\\
\For f: A \to B \in |\cat{C}|\\
\quad ( F^\cap)_f : ( F^\cap)_A \to ( F^\cap)_B \In [\cat{E} \lto \cat{D} ]
`$

通常、「上付き添字引数なら左カリー化、下付き添字引数なら右カリー化」の規則から、カリー化記号 $`{^\cap}`$ は不要と考えて、次のオーバーロードをします。

$`\quad ({^\cap F})^\hyp = F^\hyp\\
\quad ({ F^\cap})_\hyp = F_\hyp
`$

カリー化/反カリー化しても事実上同じなので、このオーバーロードは許容されると思いますが、混乱を避けるために律儀にカリー化記号 $`{^\cap}`$ を付けることにします。

カリー化した関手に対象を渡すと関手ですが、射を渡すと自然変換(関手圏の射)になります。

$`\quad (^\cap F)^g :: (^\cap F)^X \twoto (^\cap F)^Y : \cat{C} \to \cat{E} \In {\bf CAT}\\
\quad ( F^\cap)_f :: ( F^\cap)_A \twoto ( F^\cap)_B : \cat{D} \to \cat{E} \In {\bf CAT}
`$

これらの自然変換に引数を渡すとき、関手と引数渡し形式を揃えたほうがわかりやすいだろう、と思います(前節の主張)。

$`\For g:X \to Y \In \cat{D}\\
\For A\in |\cat{C}|\\
\quad (^\cap F)^g(A) : (^\cap F)^X(A) \to (^\cap F)^Y(A) \In \cat{E}\\
\:\\
\For f:A\to B\In \cat{C}\\
\For X \in |\cat{D}|\\
\quad ( F^\cap)_f(X) : ( F^\cap)_A(X) \to ( F^\cap)_B(X) \In \cat{E}
`$

カリー化した関手に“二回に分けて引数を渡す”ことは、もとの関手に“一度に二引数を渡す”のと同じですから:

$`\quad (^\cap F)^g(A) = F(A, g) : F(A, X) \to F(A, Y) \In \cat{E}\\
\quad ( F^\cap)_f(X) = F(f, X) : F(A, X) \to F(B, X) \In \cat{E}
`$

無名ラムダ変数 '$`\hyp`$' を使って言えば:

  • $`F(\hyp, X) = (^\cap F)^X(\hyp) = (^\cap F)^X`$ は関手(関手圏の対象)になる。
  • $`F(\hyp, g) = (^\cap F)^g(\hyp) = (^\cap F)^g`$ は自然変換(関手圏の射)になる。

右カリー化 $`F^\cap`$ でも同じことです。

自然変換のカリー化

関手のカリー同型は次の形に書けます。

$`\quad {\bf CAT}(\cat{C}\times \cat{D}, \cat{E}) \cong {\bf CAT}(\cat{D}, [\cat{C} \to \cat{E}] ) \In {\bf CAT}\\
\quad {\bf CAT}(\cat{C}\times \cat{D}, \cat{E}) \cong {\bf CAT}(\cat{C}, [\cat{E} \lto \cat{D} ] )\In {\bf CAT}
`$

$`\cong`$ は一般には圏同値ですが、この場合は圏同型と思っていいでしょう。

2-圏 $`{\bf CAT}`$ の指数〈内部ホム〉を使って内部化すると、カリー同型は次の形になります。

$`\quad [\cat{C}\times \cat{D}, \cat{E}] \cong [\cat{D}, [\cat{C} \to \cat{E}] ] \In {\bf CAT}\\
\quad [\cat{C}\times \cat{D}, \cat{E} ] \cong [\cat{C}, [\cat{E} \lto \cat{D} ] ] \In {\bf CAT}
`$

いずれにしても、カリー同型で結ばれる左右は、集合ではなくて圏です。したがって、カリー化関手のホムパート(ホムセットごとの写像)として、次のような写像が存在します。以下で、自然変換の集合 $`\mrm{Nat}(\hyp, \hyp)`$ は小さい状況を考えています。

$`\quad \mrm{LCurry}_{F, G}: \mrm{Nat}(F, G) \to \mrm{Nat}(\mrm{LCurry}(F), \mrm{LCurry}(G)) \In {\bf Set}\\
\quad \mrm{RCurry}_{F, G}: \mrm{Nat}(F, G) \to \mrm{Nat}(\mrm{RCurry}(F), \mrm{RCurry}(G)) \In {\bf Set}
`$

カリー化関手ホムパート写像に引数を渡すと:

$`\For \alpha :: F \twoto G : \cat{C}\times \cat{D} \to \cat{E} \In {\bf CAT}\\
\quad \mrm{LCurry}_{F, G}(\alpha) \in \mrm{Nat}({^\cap F}, {^\cap G}) \\
\quad \mrm{RCurry}_{F, G}(\alpha) \in \mrm{Nat}(F^\cap, G^\cap)
`$

自然変換のカリー化にもカリー化記号 $`{^\cap}`$ を使って短く書くと:

$`\For \alpha :: F \twoto G : \cat{C}\times \cat{D} \to \cat{E} \In {\bf CAT}\\
\quad {^\cap \alpha} :: {^\cap F} \twoto {^\cap G} : \cat{D} \to [\cat{C}\to\cat{E}]\In {\bf CAT}\\
\quad \alpha^\cap :: F^\cap \twoto G^\cap : \cat{C} \to [\cat{E}\lto \cat{D}] \In {\bf CAT}
`$

あるいは、関手圏を使って書けば:

$`\For \alpha : F \to G \In [\cat{C}\times \cat{D}, \cat{E}]\\
\quad {^\cap \alpha} : {^\cap F} \to {^\cap G} \In [\cat{D}, [\cat{C} \to \cat{E} ] ]\\
\quad \alpha^\cap : F^\cap \to G^\cap \In [\cat{C} , [ \cat{E} \lto \cat{C}] ]
`$

“二回に分けて引数を渡し”ましょう。

$`{^\cap \alpha} : {^\cap F} \to {^\cap G} \In [\cat{D}, [\cat{C} \to \cat{E} ] ]\\
\For X \in |\cat{D}|\\
\quad {^\cap \alpha}^X : {^\cap F}^X \to {^\cap G}^X \In [\cat{C} \to \cat{E}]\\
\For A \in |\cat{C}|\\
\quad {^\cap \alpha}^X(A) : {^\cap F}^X(A) \to {^\cap G}^X(A) \In \cat{E}
`$

もとの自然変換・関手に“一度に二引数を渡す”のと同じですから:

$`\quad {^\cap \alpha}^X(A) = \alpha(A, X) : F(A, X) \to G(A, X) \In \cat{E}`$

これは、「対象、次に対象」の順で引数を渡しましたが、「射、次に対象」「対象、次に射」「射、次に射」でも同じように計算できます。引数を渡し切れば、次の形が出てきます。

  1. $`\alpha(A, X) : F(A, X) \to G(A, X) \In \cat{E}`$
  2. $`\alpha(A, g) : F(A, g) \to G(A, g) \In \cat{E}`$
  3. $`\alpha(f, X) : F(f, X) \to G(f, X) \In \cat{E}`$
  4. $`\alpha(f, g) : F(f, g) \to G(f, g) \In \cat{E}`$

「引数をどう渡そうが、結局は同じ」ことが、カリー同型の本質ですが、それは関手・自然変換のカリー化の場合も同様で、様々な引数渡しが同じ結果となります。