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

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

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

参照用 記事

さらに「モナド入門」に補足:記号だの図だの

「モナドの定義とか」への追記で書こうかと思ったけど、ちょっと長いからエントリー起こします。

まず、「Kleisliトリプルの拡張オペレータ(extension; 僕はextと書いた)のHaskellでの対応物」の件は、nanakosoさんが“彷徨の末に落ち着いた経緯”を報告なさっているので、http://www3.atwiki.jp/nanakoso/pages/16.htmlをご参照ください。「>>=」と左右逆の形状の記号「=<<」で表現される高階関数は、完全にextと一致します。

右向きの矢印に見える「>>=」のほうは、右側オペランドだけをfixした状態(>>=f)がext(f)になりますが、その形状(左から右に向かう)の印象から、a >>= f で「引数aをfの拡張に送る/渡す」と読むのが心理的に自然な気がします(あくまで印象論ですが)。左から右へと書けることが>>=の重要な点かと思います;シンタックスシュガーに威力を発揮するでしょう。

さてと、ここでちょっとした記憶のコツ(実際は、記憶しないで済ますコツ)を; lift, ext, joinなどの関係を矢印の図式で捉えておくと、いつでも再現できます。

f:X→Yに、unit_Y:Y→M(Y)を後結合(post-compose)すると、次のような感じ:

      M(Y)           M(Y) 
        ↑           /
        |  ⇒   f'/  :
    f   |       /    :
X ----→Y      X . . . Y

図で、f' = f;unit_Y が後結合の結果なのだけど、これ、頭(矢印の先)だけが持ち上がっているでしょう。一方、fにextを作用させると次のよう:

               M(X)
                  \ 
             ⇒     \f^
      f               \
  X ----→Y      X . . . Y

f^ = ext(f)、こっちはお尻(矢印の根本)がヒョイと持ち上がっている。頭の次にお尻(お尻が先でもOK)を持ち上げると:

                                  f*
      M(Y)           M(Y)   M(X)----→M(Y)
        ↑           /       
        |  ⇒   f'/  :  ⇒  
    f   |       /    :      
X ----→Y      X . . . Y       X . . . Y

f* = f'^ = ext(f;unit_Y) は、頭もお尻も持ち上がって、全体の持ち上げlift(f)ってわけね。

         f*
   M(X)----→M(Y)
         ∧
         ‖(lift)
         f   
     X ----→Y

[訂正追記 date="20060422"]持ち上げの際に、「お尻が先でもOK」と書いたのは勘違い/間違い。f:X→M(Y)ならお尻を持ち上げられるけど、f:X→Yのお尻XをM(X)に持ち上げる一般的方法はありません。削除しました。
なお、f:X→M(Y)の形の関数は“M-resultic”と呼ばれて、お尻持ち上げはM-resulticな関数に限りるわけですが、f:X→M(Y), g:Y→M(Z)という2つのM-resultic関数なら、f;g^ として結合(Kleisli composition)を定義可能なところがモナドのミソなんですね。[/訂正追記]

M(X)をUとおいて、id_U:U→U i.e. id_U:M(X)→M(X)として、このid_Uのお尻をextで持ち上げると:

                   M(M(X))
                        \
                ⇒        \id^
      id                    \
M(X) ----→M(X)     M(X). . . M(X)

こうやってできるid_U^ = ext(id_U):M(M(X))→M(X)がjoinとかflattenとかunionとか書かれる関数です。圏論のほうでは、joinを乗法(慣用の記号はμ)と呼び、掛け算と類似の演算のように考えて、乗法の結合律とunitに関する単位律をモナドの定義に採用する流儀もあるんです(「モナドの定義とか」を参照)。

こういう矢印の図は… それを話し出すときりがないからココマデにしよう。