class Applicative m => Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(>>) :: forall a b. m a -> m b -> m b
m >> k = m >>=\_ -> k
return :: a -> m a
return = pure
fail :: String -> m a
fail s = errorWithoutStackTrace s
\((>>=) :: forall \ a \ b. \ m \ a \rightarrow (a \rightarrow m \ b) \rightarrow m \ b\)
上の表で、式1は対応していることが分かる。しかし、式2、即ち\(join\)と\( (>>=)\)は対応しているとは即断しがたい。そこで、Haskellでの定義を変形してみよう。モナド\(m\)は関手なので、
\begin{eqnarray}
m \ a \rightarrow (a \rightarrow m \ b)
\end{eqnarray}
の部分は、下図のように表すことができる。上図で、左側の射\(f: a \rightarrow m \ b\)を関手\(m\)によって、右側に移される。そして、\(m \ a \rightarrow (a \rightarrow m \ b)\)は、右側に移った射の始点\(m \ a\)が与えられた時、その終点をあたえる。このとき右側に移った射は\(fmap \ f \ (m \ a)\)である。これより、
\begin{eqnarray}
m \ a \rightarrow (a \rightarrow m \ b) & = & (fmap \ f \ (m \ a)) \\
& = & m (f (a)) \\
& = & m (m \ b)
\end{eqnarray}
となる。まとめると、
\begin{eqnarray}
m \ a \rightarrow (a \rightarrow m \ b) \rightarrow m \ b \\
= m (m \ b) \rightarrow m \ b
\end{eqnarray}
である。\(b\)を\(a\)で置き換えると、
\begin{eqnarray}
m (m \ a) \rightarrow m \ a
\end{eqnarray}
となり、\(join\)同じであることが分かる。
\begin{eqnarray}
η &:& A & \rightarrow & T(A) \\
μ &:& T(T(A) & \rightarrow & T(A)
\end{eqnarray}
さらに、\(T(A),T(T(A)),…\)は同じ薄茶色で表し、薄緑色の部分をなくすと、前に示した図は次のように表すことができる。上の式をもう少し変形してみよう。恒等射\(I:A \rightarrow A\)を用いると上記の式は次のようになる。
\begin{eqnarray}
η &:& I(A) & \rightarrow & T(A) \\
μ &:& T(T(A) & \rightarrow & T(A)
\end{eqnarray}
上記の式は任意の\(A\)について成り立つので、\(A\)を省くと
\begin{eqnarray}
η &:& I & \rightarrow & T \\
μ &:& T \circ T & \rightarrow & T
\end{eqnarray}
と記述することができる。そこで、圏\(\mathcal{C}\)を対象とし、関手\(T\)を射とし、モナドを表す圏\(\mathcal{D}\)をつぎのように定義できる。
圏\(\mathcal{D}\)の構成
対象:圏\(\mathcal{C}\)
射:\(T: \mathcal{C} \rightarrow \mathcal{C} \)
恒等射:\(I_\mathcal{C} \)
合成:\(\circ\)
そして、次のように、単位律、結合律を満たすものとする。
単位律:\(I_\mathcal{C} \circ T= I_\mathcal{C} = T \circ I_\mathcal{C} \)
結合律:\( (T \circ T) \circ T = T \circ (T \circ T) \)
圏\(\mathcal{D}\)は、さらに
\begin{eqnarray}
η&:& I_\mathcal{C} & \rightarrow & T \\
μ&:& T \circ T & \rightarrow & T
\end{eqnarray}
を満たすものとする。ここでは、\(η: I \rightarrow T \)から\(η: I_\mathcal{C} \rightarrow T \)に変えている。恒等射の定義域が単純な実体の領域から表層の領域まで含むようになったが、\(η: I_T \rightarrow T \circ T \rightarrow T \)であることから、矛盾なく拡張することが可能である。
圏\(\mathcal{C}\)と\(\mathcal{D}\)の余単位・単位随伴は二つの関手
\begin{eqnarray}
L: \mathcal{D} \rightarrow \mathcal{C} \\
R: \mathcal{C} \rightarrow \mathcal{D}
\end{eqnarray}
および二つの自然変換
\begin{eqnarray}
η: I_\mathcal{D} \rightarrow R \circ L \\
ε: L \circ R \rightarrow I_\mathcal{C}
\end{eqnarray}
であって(ηは単位、εは余単位と呼ばれる)、これらの合成
\begin{eqnarray}
L =L \circ I_\mathcal{D} \xrightarrow{L \circ η} L \circ R \circ L \xrightarrow{ε\circ L} L \\
R = I_\mathcal{D} \circ R \xrightarrow{η\circ R} R \circ L \circ R \xrightarrow{R \circ ε} R
\end{eqnarray}
がそれぞれ\(L\)と\(R\)上の恒等変換\(I_L,I_R\)となることをいうとなっている。これは三角恒等式(triangle identities)と呼ばれる。これを可換図式で示そう。それではこの定義からモナドを導くこととしよう。圏\( \mathbf{End}_\mathcal{C} \)での射\(η,μ\)が、随伴を定めている\(η,ε\)から得られることを示せばよい。そこで、
\begin{eqnarray}
T=R \circ L
\end{eqnarray}
としてみよう。モナド側の\(η\)を得ることは次に示すように簡単である。
\begin{eqnarray}
I_\mathcal{D} \xrightarrow{η} R \circ L = T
\end{eqnarray}
それでは\(μ\)について考えよう。次のように変換して求めることができる。
\begin{eqnarray}
T \circ T = R \circ L \circ R \circ L \xrightarrow{R \circ ε \circ L} R \circ I_\mathcal{C} \circ L = R \circ L = T
\end{eqnarray}
圏\( \mathbf{End}_\mathcal{C} \)の単位律、結合律を随伴から得てみよう。まず単位律から始める。
\begin{eqnarray}
L \xrightarrow{L \circ η} L \circ R \circ L \xrightarrow{ε\circ L} L \\
R \xrightarrow{η\circ R} R \circ L \circ R \xrightarrow{R \circ ε} R
\end{eqnarray}
と、およびそれぞれで左辺と右辺は恒等変換になっていることを利用すると
\begin{eqnarray}
T \circ I_\mathcal{D} = R \circ L \circ I_\mathcal{D} \xrightarrow{R \circ L \circ η} R \circ L \circ R \circ L \xrightarrow{R \circ ε \circ L} R \circ L = T \\
I_\mathcal{D} \circ T = I_\mathcal{D} \circ R \circ L \xrightarrow{η \circ R \circ L} R \circ L \circ R \circ L \xrightarrow{R \circ ε \circ L} R \circ L = T
\end{eqnarray}
を得る。またそれぞれで左辺と右辺は恒等変換になっていることもわかる。可換図式で示すと下図のようになる。
*Main Control.Monad> f x rest =\b ->if b then rest >>= return . (x:) else rest
*Main Control.Monad> [True, False] >>= f 1 [[2,3],[2],[3]]
[[1,2,3],[1,2],[1,3],[2,3],[2],[3]]
少し、工夫をして、\(x\)の値を外から与えられるようにしよう。
\x -> const [True, False] x >>=\b ->if b then rest >>= (return . (x:)) else rest
確認しよう。
*Main Control.Monad> g rest =\x -> const [True, False] x >>=\b ->if b then rest >>= (return . (x:)) else rest
*Main Control.Monad> g [[2,3],[2],[3]] 1
[[1,2,3],[1,2],[1,3],[2,3],[2],[3]]
56号線を北上していくと左側に目的地のGarden Island Chocolateが出てくる。しかし、Googleの道案内によれば、ここを通り越して、はるか先のハナレイ国立野生棒物保護区のロータリーで引き返すようになっている。56号線は高速道路なので、Googleは左折することができないと認識している。このため、Uターンできる地点を探しているのだ。我々はこの道案内に従ったために損をした。危うく集合時間に間に合わないところだった。
この日は、前日カヤックツアーに行くときの道すがらに見つけたボタニカルガーデンだ。少し長いがその名前は、パウ・マウ・プレース・植物園(Pua Mau Place Arboretum and Botanical Garden)だ。植物学者のプレイス博士(Virgil Place)によって、1974年に造られた。
そうこうするうちに、Gayeが激しく非難した。しかし、初めて出会った単語で意味が取れなかった。”You are xxx. You are xxx” といっていた。口では勝てなくなったEdが静かに部屋から退場し、冷却の時間になった。xxxの意味を聞きたかったのだが、私の方に攻撃が回ってくると大変なので、耐えた。教科書にもなく、通常の会話にも出てこないので、とても興味があった単語だが、今となっては単語の音を忘れてしまったので、調べることもできない。
運転をしているGayeから、朝食のレストランを探して欲しいと頼まれた。日本からのモバイルは「アメリカし放題」だが、データ量に応じて料金が発生する。どの程度になるかに不安に覚えながら、モバイルを操作した。得られた情報によれば、Paul’s Placeがおすすめだった。さらに開店時間を調べたところ、なんと月曜日は閉店となっていた。嫌な予感がしたが、次のおすすめはKens House of Pancakeだった。妻もパンケーキを食べたいと言っていたので、さらに調べると、ここは24時間毎日営業。ここに行きましょうと決めて、地図で詳しい場所を調べた。