SlideShare a Scribd company logo
KSB:河原研究室発表会
              (河原康雄先生還暦記念)
                   2005年7月29日	




圏論のモナドとHaskellのモナド	

  九州大学 大学院数理学研究院
       溝 口 佳 寛
河原先生との出会い	
                      昭和54年(1979年)4月 溝口(大学1年生)
                      教養部での数学科専門科目
                      「情報数学序論」を担当されていた!
                             (受講せず!!)




昭和57年4月 数学講究(大学4年生)
圏論の情報科学への応用に惹かれる!
  (ゼミ生は1名だった!!)
LAシンポジウム会報No.7 (1986年7月)

(講座紹介)
九州大学理学部数学教室 数理解析学講座
                  河 原 康 雄

(一部略)

 私が所属するのは, 九州大学・理学部・数学教室・数理解析学講座で, 初代講座
担当教授は工藤達二先生(昭和56年2月~昭和58年3月, 現在久留米工業大学
教授)でしたが, 昨年4月からは大阪大学より赴任された田中俊一教授が講座を担
当されています. 私はここの助教授で, 助手として藤井一幸氏および現在西ドイツ
のPaderbornに遊学中の宮野悟氏の二人が所属しています. 大学院生としては,
溝口佳寛君(DC.2), 伊達博君, 大塚寛君(MC.2), 正代隆義君, 藤田義史君(MC.
1)が在籍し, また4年生セミナーには今年度14名(内女子学生4名)の受講者がいま
す.
そのころの写真がありました。	
            この冷蔵庫が, 現在の溝口教
            官室(3208室)に残っている!
                 (今は故障してます!!) →




LAシンポジウム(犬山!?)              14名(!?)の4年生たち.
LAシンポジウム会報No.7 (1986年7月) [続き]

 さて, この我国では聞きなれない数理解析学講座でどのような研究が行われているかをご
紹介しましょう. 田中先生は主に, グラフアルゴリズム, 組合せ最適化, ロボットの数理を研究
されており, 私はカテゴリー論そのものからカテゴリー論の情報数学(例えば, オートマトン,
Gouen-Burstallのinstitution, プログラムの代数的意味論など)への応用に興味を持ってい
ます. 助手の藤井氏は, トポロジーの知識に基づく場の量子論の数学的構成の研究, 宮野
氏は, オートマトン理論における階層定理, 計算量理論, 並列処理の理論の研究分野にお
いてそれぞれ活躍中です.
 また, 理学部には基礎情報学研究施設が付設されており, LAの会員として, 有川節夫教
授, 武谷俊一助教授, 原口誠助手がおられ, 研究・教育など色々の面で協力を頂いておりま
す. 例えば, 定期的なものとしては田中先生と有川先生が感じとして毎月1回情報数学談話
会が共済されており, その他では現在, 原口氏, 山本章博君(有川研のMC.2)達とrewriting
system, Goguen-Burstallのinstitutionについて合同セミナーを開催しています.
 更に, 九大・数学教室で情報数学に関して計算数学講座担当の藤野精一先生を忘れるこ
とはできないでしょう. ご承知のように先生は早くよりオートマトン理論, リスト処理等の研究
および紹介に貢献され, 現在はTraubなどの計算量理論, 数値解析を研究されています. ま
た, 数学基礎論の上江洲忠弘先生もおられ, 基礎論の観点から情報数学へ助言・提言を頂
いています.
LAシンポジウム会報No.7 (1986年7月) [続き2]

最後に, 最近の数理解析学講座の修士論文・学位論文の題目をお知らせします.

[修士論文]
溝口佳寛: 圏M-Set上のパワーセットモナド, フィルターモナドおよびプライムフィル
ターモナドについて (昭和60年2月)

[博士論文]
宮野悟: Hierarchy Theorems in Automata Theory (昭和59年3月)
藤井一幸: Study of Dynamics of Non-Linear Grassmann Sigma Models (昭和60
年12月)
圏論のモナド(1)
•  圏(category)とは?
  集合の圏, 群の圏, 連続束の圏, 位相空間の
   圏, 関係の圏など
•  関手(functor)とは?
   構造を忘れる関手, 代数構造を自由生成する
   関手など
•  自然変換(natural transformation)とは?
   関手で移された構造物間の射を一斉に与え
   る
例 (HaskellのListとconcat)
•  圏
集合の圏(Set) (集合と写像の圏),
リストの圏(List) (文字列と半群準同型の圏)
A=Integer (整数全体の集合)
•  L: Set → List は関手 LA=[A]
1,2,3 ∈A, [1,2,3] ∈LA
f: A→Bに対して, Lf = (map f)
Lf [1,2,3] = (map f [1,2,3]) = [f(1),f(2),f(3)]
•  concat: [[A]]→[A]: LLA→LA は自然変換
concat [[1,2],[3],[4,5,6]] = [1,2,3,4,5,6]
•  return: A→[A]: Id A→ LA も自然変換
return x = [x]
圏論のモナド(2)
•  随伴関手(adjoint functor)とは?
   関手 F:C→D, G:D→C に対して,
   射A→GB と FA→B とが自然に 1対1対応す
   るとき, FとGを随伴関手(adjoint)と言う.
•  例
 G:List→Set を構造を忘れる関手,
   F=T:Set→List を自由半群を生成する関手と
   すると, FとGはadjointになる.
圏論のモナド(3)
•  モナドとは?
 Eilenberg&Moore’s Triples (T,η,µ)
T: C→C (functor)
η: id→T , µ:TT→T (natural transformation)
(T,η,µがある関係式らを満たすときモナドと言う)
•  例
随伴関手 F:C→D, G:D→C に対して,
T=GF:C→Cとして, 自然にモナドを構成出来る.
圏論のモナド(4)
•  モナドとは? (再)
   Kleisli triples (M, return, >>=)
M:Obj(C)→Obj(C) (写像)
return: A→MA (写像, A∈Obj(C))
>>=:C(A,MB)→C(MA,MB) (写像, A,B∈Obj(C))
M,return,>>=がある関係式らを満たすとき, Kleisliの
   tripleと言う.
•  例
随伴関手 F:C→D, G:D→C に対して,
M=GF:C→Cとして, 自然にKleisli tripleを構成できる.
例 (HaskellのList monad)
•  F:Set→List, G:List→Set, に対して, M=GF:Set→Set
   とする. (注: FA=[A])
•  return: A → [A] を return x = [x]
•  >>=:(A→MB)→(MA→MB) を
  >>=(f)(a) を a>>=f と書くことにして,
    a>>=f = concat (map f a) とすると,
   (M,return,>>=)は, Kleisli’s tripleとなる.
•  例 [1,2,3]>>=(λx.[x,2*x])
    = concat (map (λx.[x,2*x]) [1,2,3])
    = concat [[1,2],[2,4],[3,6]]
    = [1,2,2,4,3,6]
圏論のモナド(5)
•  adjoint functors F:C→D, G:D→Cから, tripleが作れ
   るが, 逆にtripleから, それを導くadjoint functors F,G
   を作ることは出来ないのだろうか?
•  Eilenberg and Moore’s solution
   T代数(T-algebra)の圏(CT)
   対象(A,ξ)を(A∈Obj(C),ξ:TA→A) とし,
   射f:(A,ξ)→(B,ζ)を, f ξ = ζ Tf を満たすCの射とする
   FT:C→ CT をFTA=(TA,µA )(µA:TTA→TA)で定める
   と, adjoint functorを構成出来る.
圏論のモナド(6)
•  Kleisli’s solution
   Kleisli圏(CT)
   対象はCと同じ, 射f:A→BをA→TBとする.
   射の結合をg:B→Cとするとき, h=gf を
   h a = (f a) >>= g で定義する.
   このとき, CTは圏となる.
   関手GT : CT →CをGT A=TA, GT f=(>>=f) と
   すると, adjoint functorを構成出来る.
圏論のモナド(7)
•  Eilenberg&MoorとKelisliのtripleの概念は同等.
   f:A→B, Tf:TA→TB, Tf := >>= (returnB. f)
   µA:= >>= idA :TTA→TA
    逆は, f:A→TB, >>= f := µA Tf
•  Kleisli圏CTは, T代数の圏CTに自然に埋め込まれ,
   自由T代数の圏と同等になる.
•  モナドTを構成するadjunctionたちについて, Kleisli
   圏はinitial objectになり, T代数圏はfinal objectにな
   る.
•  先に与えられたadjunction F:C→D, G:D→Cに対し
   ては, DとCTが同等になるための条件を与えたBeck
   の定理が有名.
講義ノート(1)
講義ノート (2)
講義ノート (3)
Haskellのモナド(1)
•  例
Instance Monad [ ] where
   xs >>= f = concat (map f xs)
   return x = [x]
•  do文は, monad関数のsyntax sugar!
  do a←[1,2,3]; b←[3,4,5]; return (a+b)
は,
   [1,2,3] >>= (λa. ([3,4,5]>>=λb.return(a+b))
= concat (map (λa.concat (map (λb.[a+b]) [3,4,5]))[1,2,3])
= concat [concat (map (λb.[1+b]) [3,4,5]),
            concat (map (λb.[2+b]) [3,4,5]),
            concat (map (λb.[3+b]) [3,4,5])]
= concat [[4,5,6],[5,6,7],[6,7,8]]=[4,5,6,5,6,7,6,7,8]
•  先のdo文を[a+b | a←[1,2,3],b←[3,4,5]]と書くのもsyntax sugar!!
Haskellのモナド(2)
•  なぜモナドを使うのか?
 –  Kleisli圏の対象と考えられるデータ構造は, 必要な関
    数(return,>>=)を定義して, モナドにしておくと良い.
    なぜ良いのか?
 –  プログラムが見やすくなる.
 –  構造に付随する部分と問題依存の部分とのプログラ
    ムを分割出来る.
 –  do文のsemanticsを関数型プログラミングの範疇で
    与えることが出来る.
 –  圏論は数学のデザインパターン, デザインパターンを
    使って、お行儀の良いプログラムを書きましょう.
Haskellのモナド(3)
State Transformation
f1 w a = let (b,x) = g1 w a
              (c,y) = h1 w x b
              (d,z) = i1 w x y c
          in (d,z)

C言語の大域変数に相当する状態を全ての計算で保
 持しようとすると, 上記のa,b,c,dのような関数の計算
 結果とは別に常に状態変数を引数と結果に持つよう
 なプログラミングが必要になる.
Haskellのモナド(4)
Type S s a = s → (s, a)
>>=::S s a →(a→S s b)→S s b
p >>= k = λs0 . let (s1,a)= p s0         % p: s→(s, a)
                       q=ka                % q: s→(s, b)
                  in q s1
return::a → S s a
return a = λs. (s,a)
このようにモナドSを定義すると, 先のプログラムは,
f w = g w >>= (λx.(h w x >>= (λy.(i w x y)>>=λz.return z)))
と書くことが出来る.
さらに, do文のsyntax sugar を使うと,
f w = do x←g w; y←h w x; z←I w x y; return z
と書くことが出来る.
Haskellのモナド(5)
•   リストを集合と考えると, リストモナドは, powerset funcorのKleisli圏, すなわち, 関係の圏となる.
    (関係の結合が, Kleisli圏の>>=に対応する.)
•  例
aa = [1,2,3]
alpha = [(1,4),(1,5),(2,6)]
bb = [4,5,6]
beta = [(4,7),(5,8),(6,8)]
cc = [7,8,9]

return::Integer→[Integer]
>>=::[Integer]→(Integer→[Integer])→[Integer]

pf::[(Integer,Integer)]→Integer→[Integer]                         % P(A x A) ~ (A→PA)
pf r a = nub [y | (x,y)←r, x==a]

●::[(Integer,Integer)]→[(Integer,Integer)]→Integery→[Integer]
(a ● b) x = (return x) >>= (pf a) >>= (pf b)

fp::[Integer]→[Integer]→(Integer→[Integer])→[(Integer,Integer)]
fp dom cod f = [(x,y) | x←dom, y←cod, y ∈ (f x)]

alpha_beta = fp aa cc (alpha ● beta)
alpha_beta = [(1,7),(1,8),(2,8)] となる.
もちろん, 直接計算も可! alpha_beta_direct = [(x,z) | (x,y0)←alpha, (y1,z)←beta, y0==y1]
参考文献	
•  A.Schalk, Some notes on monads, 16pages, 2002.
       http://www.cs.man.ac.uk/~schalk/notes/
       (Kleisli圏とT代数圏の比較について書いてある.)
•  T.Norvell, Monads for the Working Haskell Programmer, 15pages(html),
       http://www.engr.mun.ca/~theo/Misc/haskell_and_monads.htm
       (Haskellのmonadについての短いチュートリアル)
•  P.Hundak, J.Peterson, J.H.Fasel, A Gentle Introduction to Haskell 98,
       64pages, 1999. http://www.haskell.org/tutorial/
       (Haskell 98言語の紹介, monadについても10pagesほど記述がある.)
•  P.Wadler, (モナドに関する論文を多数書いている.)
      http://homepages.inf.ed.ac.uk/wadler/topics/monads.html
	
 	
 The	
 marriage	
 of	
 effects	
 and	
 monads,	
 The	
 marriage	
 of	
 effects	
 and	
 
       monads	
 , How	
 to	
 declare	
 an	
 imperative	
 ,	
 Monads	
 and	
 composable	
 
       continuations,	
 Imperative	
 functional	
 programming	
 ,	
 Monads	
 for	
 
       functional	
 programming,	
 Comprehending	
 monads	
 (モナドの具体例がた
       くさんある),	
 Combining	
 monads,	
 The	
 essence	
 of	
 functional	
 
       programming	
 	
 
•  H.Daume, Yet Another Haskell Tutorial, 198pages, 2002.
       http://www.isi.edu/~hdaume/htut/ (monadについては, p.119-155)

More Related Content

圏論のモナドとHaskellのモナド

  • 1. KSB:河原研究室発表会 (河原康雄先生還暦記念) 2005年7月29日 圏論のモナドとHaskellのモナド 九州大学 大学院数理学研究院 溝 口 佳 寛
  • 2. 河原先生との出会い 昭和54年(1979年)4月 溝口(大学1年生) 教養部での数学科専門科目 「情報数学序論」を担当されていた! (受講せず!!) 昭和57年4月 数学講究(大学4年生) 圏論の情報科学への応用に惹かれる! (ゼミ生は1名だった!!)
  • 3. LAシンポジウム会報No.7 (1986年7月) (講座紹介) 九州大学理学部数学教室 数理解析学講座                   河 原 康 雄 (一部略)  私が所属するのは, 九州大学・理学部・数学教室・数理解析学講座で, 初代講座 担当教授は工藤達二先生(昭和56年2月~昭和58年3月, 現在久留米工業大学 教授)でしたが, 昨年4月からは大阪大学より赴任された田中俊一教授が講座を担 当されています. 私はここの助教授で, 助手として藤井一幸氏および現在西ドイツ のPaderbornに遊学中の宮野悟氏の二人が所属しています. 大学院生としては, 溝口佳寛君(DC.2), 伊達博君, 大塚寛君(MC.2), 正代隆義君, 藤田義史君(MC. 1)が在籍し, また4年生セミナーには今年度14名(内女子学生4名)の受講者がいま す.
  • 4. そのころの写真がありました。 この冷蔵庫が, 現在の溝口教 官室(3208室)に残っている! (今は故障してます!!) → LAシンポジウム(犬山!?) 14名(!?)の4年生たち.
  • 5. LAシンポジウム会報No.7 (1986年7月) [続き]  さて, この我国では聞きなれない数理解析学講座でどのような研究が行われているかをご 紹介しましょう. 田中先生は主に, グラフアルゴリズム, 組合せ最適化, ロボットの数理を研究 されており, 私はカテゴリー論そのものからカテゴリー論の情報数学(例えば, オートマトン, Gouen-Burstallのinstitution, プログラムの代数的意味論など)への応用に興味を持ってい ます. 助手の藤井氏は, トポロジーの知識に基づく場の量子論の数学的構成の研究, 宮野 氏は, オートマトン理論における階層定理, 計算量理論, 並列処理の理論の研究分野にお いてそれぞれ活躍中です.  また, 理学部には基礎情報学研究施設が付設されており, LAの会員として, 有川節夫教 授, 武谷俊一助教授, 原口誠助手がおられ, 研究・教育など色々の面で協力を頂いておりま す. 例えば, 定期的なものとしては田中先生と有川先生が感じとして毎月1回情報数学談話 会が共済されており, その他では現在, 原口氏, 山本章博君(有川研のMC.2)達とrewriting system, Goguen-Burstallのinstitutionについて合同セミナーを開催しています.  更に, 九大・数学教室で情報数学に関して計算数学講座担当の藤野精一先生を忘れるこ とはできないでしょう. ご承知のように先生は早くよりオートマトン理論, リスト処理等の研究 および紹介に貢献され, 現在はTraubなどの計算量理論, 数値解析を研究されています. ま た, 数学基礎論の上江洲忠弘先生もおられ, 基礎論の観点から情報数学へ助言・提言を頂 いています.
  • 6. LAシンポジウム会報No.7 (1986年7月) [続き2] 最後に, 最近の数理解析学講座の修士論文・学位論文の題目をお知らせします. [修士論文] 溝口佳寛: 圏M-Set上のパワーセットモナド, フィルターモナドおよびプライムフィル ターモナドについて (昭和60年2月) [博士論文] 宮野悟: Hierarchy Theorems in Automata Theory (昭和59年3月) 藤井一幸: Study of Dynamics of Non-Linear Grassmann Sigma Models (昭和60 年12月)
  • 7. 圏論のモナド(1) •  圏(category)とは? 集合の圏, 群の圏, 連続束の圏, 位相空間の 圏, 関係の圏など •  関手(functor)とは? 構造を忘れる関手, 代数構造を自由生成する 関手など •  自然変換(natural transformation)とは? 関手で移された構造物間の射を一斉に与え る
  • 8. 例 (HaskellのListとconcat) •  圏 集合の圏(Set) (集合と写像の圏), リストの圏(List) (文字列と半群準同型の圏) A=Integer (整数全体の集合) •  L: Set → List は関手 LA=[A] 1,2,3 ∈A, [1,2,3] ∈LA f: A→Bに対して, Lf = (map f) Lf [1,2,3] = (map f [1,2,3]) = [f(1),f(2),f(3)] •  concat: [[A]]→[A]: LLA→LA は自然変換 concat [[1,2],[3],[4,5,6]] = [1,2,3,4,5,6] •  return: A→[A]: Id A→ LA も自然変換 return x = [x]
  • 9. 圏論のモナド(2) •  随伴関手(adjoint functor)とは? 関手 F:C→D, G:D→C に対して, 射A→GB と FA→B とが自然に 1対1対応す るとき, FとGを随伴関手(adjoint)と言う. •  例  G:List→Set を構造を忘れる関手, F=T:Set→List を自由半群を生成する関手と すると, FとGはadjointになる.
  • 10. 圏論のモナド(3) •  モナドとは? Eilenberg&Moore’s Triples (T,η,µ) T: C→C (functor) η: id→T , µ:TT→T (natural transformation) (T,η,µがある関係式らを満たすときモナドと言う) •  例 随伴関手 F:C→D, G:D→C に対して, T=GF:C→Cとして, 自然にモナドを構成出来る.
  • 11. 圏論のモナド(4) •  モナドとは? (再) Kleisli triples (M, return, >>=) M:Obj(C)→Obj(C) (写像) return: A→MA (写像, A∈Obj(C)) >>=:C(A,MB)→C(MA,MB) (写像, A,B∈Obj(C)) M,return,>>=がある関係式らを満たすとき, Kleisliの tripleと言う. •  例 随伴関手 F:C→D, G:D→C に対して, M=GF:C→Cとして, 自然にKleisli tripleを構成できる.
  • 12. 例 (HaskellのList monad) •  F:Set→List, G:List→Set, に対して, M=GF:Set→Set とする. (注: FA=[A]) •  return: A → [A] を return x = [x] •  >>=:(A→MB)→(MA→MB) を   >>=(f)(a) を a>>=f と書くことにして, a>>=f = concat (map f a) とすると, (M,return,>>=)は, Kleisli’s tripleとなる. •  例 [1,2,3]>>=(λx.[x,2*x]) = concat (map (λx.[x,2*x]) [1,2,3]) = concat [[1,2],[2,4],[3,6]] = [1,2,2,4,3,6]
  • 13. 圏論のモナド(5) •  adjoint functors F:C→D, G:D→Cから, tripleが作れ るが, 逆にtripleから, それを導くadjoint functors F,G を作ることは出来ないのだろうか? •  Eilenberg and Moore’s solution T代数(T-algebra)の圏(CT) 対象(A,ξ)を(A∈Obj(C),ξ:TA→A) とし, 射f:(A,ξ)→(B,ζ)を, f ξ = ζ Tf を満たすCの射とする FT:C→ CT をFTA=(TA,µA )(µA:TTA→TA)で定める と, adjoint functorを構成出来る.
  • 14. 圏論のモナド(6) •  Kleisli’s solution Kleisli圏(CT) 対象はCと同じ, 射f:A→BをA→TBとする. 射の結合をg:B→Cとするとき, h=gf を h a = (f a) >>= g で定義する. このとき, CTは圏となる. 関手GT : CT →CをGT A=TA, GT f=(>>=f) と すると, adjoint functorを構成出来る.
  • 15. 圏論のモナド(7) •  Eilenberg&MoorとKelisliのtripleの概念は同等. f:A→B, Tf:TA→TB, Tf := >>= (returnB. f) µA:= >>= idA :TTA→TA 逆は, f:A→TB, >>= f := µA Tf •  Kleisli圏CTは, T代数の圏CTに自然に埋め込まれ, 自由T代数の圏と同等になる. •  モナドTを構成するadjunctionたちについて, Kleisli 圏はinitial objectになり, T代数圏はfinal objectにな る. •  先に与えられたadjunction F:C→D, G:D→Cに対し ては, DとCTが同等になるための条件を与えたBeck の定理が有名.
  • 19. Haskellのモナド(1) •  例 Instance Monad [ ] where xs >>= f = concat (map f xs) return x = [x] •  do文は, monad関数のsyntax sugar! do a←[1,2,3]; b←[3,4,5]; return (a+b) は, [1,2,3] >>= (λa. ([3,4,5]>>=λb.return(a+b)) = concat (map (λa.concat (map (λb.[a+b]) [3,4,5]))[1,2,3]) = concat [concat (map (λb.[1+b]) [3,4,5]), concat (map (λb.[2+b]) [3,4,5]), concat (map (λb.[3+b]) [3,4,5])] = concat [[4,5,6],[5,6,7],[6,7,8]]=[4,5,6,5,6,7,6,7,8] •  先のdo文を[a+b | a←[1,2,3],b←[3,4,5]]と書くのもsyntax sugar!!
  • 20. Haskellのモナド(2) •  なぜモナドを使うのか? –  Kleisli圏の対象と考えられるデータ構造は, 必要な関 数(return,>>=)を定義して, モナドにしておくと良い. なぜ良いのか? –  プログラムが見やすくなる. –  構造に付随する部分と問題依存の部分とのプログラ ムを分割出来る. –  do文のsemanticsを関数型プログラミングの範疇で 与えることが出来る. –  圏論は数学のデザインパターン, デザインパターンを 使って、お行儀の良いプログラムを書きましょう.
  • 21. Haskellのモナド(3) State Transformation f1 w a = let (b,x) = g1 w a (c,y) = h1 w x b (d,z) = i1 w x y c in (d,z) C言語の大域変数に相当する状態を全ての計算で保 持しようとすると, 上記のa,b,c,dのような関数の計算 結果とは別に常に状態変数を引数と結果に持つよう なプログラミングが必要になる.
  • 22. Haskellのモナド(4) Type S s a = s → (s, a) >>=::S s a →(a→S s b)→S s b p >>= k = λs0 . let (s1,a)= p s0 % p: s→(s, a) q=ka % q: s→(s, b) in q s1 return::a → S s a return a = λs. (s,a) このようにモナドSを定義すると, 先のプログラムは, f w = g w >>= (λx.(h w x >>= (λy.(i w x y)>>=λz.return z))) と書くことが出来る. さらに, do文のsyntax sugar を使うと, f w = do x←g w; y←h w x; z←I w x y; return z と書くことが出来る.
  • 23. Haskellのモナド(5) •  リストを集合と考えると, リストモナドは, powerset funcorのKleisli圏, すなわち, 関係の圏となる. (関係の結合が, Kleisli圏の>>=に対応する.) •  例 aa = [1,2,3] alpha = [(1,4),(1,5),(2,6)] bb = [4,5,6] beta = [(4,7),(5,8),(6,8)] cc = [7,8,9] return::Integer→[Integer] >>=::[Integer]→(Integer→[Integer])→[Integer] pf::[(Integer,Integer)]→Integer→[Integer] % P(A x A) ~ (A→PA) pf r a = nub [y | (x,y)←r, x==a] ●::[(Integer,Integer)]→[(Integer,Integer)]→Integery→[Integer] (a ● b) x = (return x) >>= (pf a) >>= (pf b) fp::[Integer]→[Integer]→(Integer→[Integer])→[(Integer,Integer)] fp dom cod f = [(x,y) | x←dom, y←cod, y ∈ (f x)] alpha_beta = fp aa cc (alpha ● beta) alpha_beta = [(1,7),(1,8),(2,8)] となる. もちろん, 直接計算も可! alpha_beta_direct = [(x,z) | (x,y0)←alpha, (y1,z)←beta, y0==y1]
  • 24. 参考文献 •  A.Schalk, Some notes on monads, 16pages, 2002. http://www.cs.man.ac.uk/~schalk/notes/ (Kleisli圏とT代数圏の比較について書いてある.) •  T.Norvell, Monads for the Working Haskell Programmer, 15pages(html), http://www.engr.mun.ca/~theo/Misc/haskell_and_monads.htm (Haskellのmonadについての短いチュートリアル) •  P.Hundak, J.Peterson, J.H.Fasel, A Gentle Introduction to Haskell 98, 64pages, 1999. http://www.haskell.org/tutorial/ (Haskell 98言語の紹介, monadについても10pagesほど記述がある.) •  P.Wadler, (モナドに関する論文を多数書いている.) http://homepages.inf.ed.ac.uk/wadler/topics/monads.html The marriage of effects and monads, The marriage of effects and monads , How to declare an imperative , Monads and composable continuations, Imperative functional programming , Monads for functional programming, Comprehending monads (モナドの具体例がた くさんある), Combining monads, The essence of functional programming •  H.Daume, Yet Another Haskell Tutorial, 198pages, 2002. http://www.isi.edu/~hdaume/htut/ (monadについては, p.119-155)