「モナドの定義とか」への追記で書こうかと思ったけど、ちょっと長いからエントリー起こします。
まず、「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に関する単位律をモナドの定義に採用する流儀もあるんです(「モナドの定義とか」を参照)。
こういう矢印の図は… それを話し出すときりがないからココマデにしよう。