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

5,365 views

Published on

2005年7月29日
河原研究室発表会資料
(河原康雄先生還暦記念)

Published in: Education
0 Comments
15 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,365
On SlideShare
0
From Embeds
0
Number of Embeds
251
Actions
Shares
0
Downloads
48
Comments
0
Likes
15
Embeds 0
No embeds

No notes for slide

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

  1. 1. KSB:河原研究室発表会 (河原康雄先生還暦記念) 2005年7月29日 圏論のモナドとHaskellのモナド 九州大学 大学院数理学研究院 溝 口 佳 寛
  2. 2. 河原先生との出会い 昭和54年(1979年)4月 溝口(大学1年生) 教養部での数学科専門科目 「情報数学序論」を担当されていた! (受講せず!!)昭和57年4月 数学講究(大学4年生)圏論の情報科学への応用に惹かれる! (ゼミ生は1名だった!!)
  3. 3. LAシンポジウム会報No.7 (1986年7月)(講座紹介)九州大学理学部数学教室 数理解析学講座                  河 原 康 雄(一部略) 私が所属するのは, 九州大学・理学部・数学教室・数理解析学講座で, 初代講座担当教授は工藤達二先生(昭和56年2月~昭和58年3月, 現在久留米工業大学教授)でしたが, 昨年4月からは大阪大学より赴任された田中俊一教授が講座を担当されています. 私はここの助教授で, 助手として藤井一幸氏および現在西ドイツのPaderbornに遊学中の宮野悟氏の二人が所属しています. 大学院生としては,溝口佳寛君(DC.2), 伊達博君, 大塚寛君(MC.2), 正代隆義君, 藤田義史君(MC.1)が在籍し, また4年生セミナーには今年度14名(内女子学生4名)の受講者がいます.
  4. 4. そのころの写真がありました。 この冷蔵庫が, 現在の溝口教 官室(3208室)に残っている! (今は故障してます!!) →LAシンポジウム(犬山!?) 14名(!?)の4年生たち.
  5. 5. LAシンポジウム会報No.7 (1986年7月) [続き] さて, この我国では聞きなれない数理解析学講座でどのような研究が行われているかをご紹介しましょう. 田中先生は主に, グラフアルゴリズム, 組合せ最適化, ロボットの数理を研究されており, 私はカテゴリー論そのものからカテゴリー論の情報数学(例えば, オートマトン,Gouen-Burstallのinstitution, プログラムの代数的意味論など)への応用に興味を持っています. 助手の藤井氏は, トポロジーの知識に基づく場の量子論の数学的構成の研究, 宮野氏は, オートマトン理論における階層定理, 計算量理論, 並列処理の理論の研究分野においてそれぞれ活躍中です. また, 理学部には基礎情報学研究施設が付設されており, LAの会員として, 有川節夫教授, 武谷俊一助教授, 原口誠助手がおられ, 研究・教育など色々の面で協力を頂いております. 例えば, 定期的なものとしては田中先生と有川先生が感じとして毎月1回情報数学談話会が共済されており, その他では現在, 原口氏, 山本章博君(有川研のMC.2)達とrewritingsystem, Goguen-Burstallのinstitutionについて合同セミナーを開催しています. 更に, 九大・数学教室で情報数学に関して計算数学講座担当の藤野精一先生を忘れることはできないでしょう. ご承知のように先生は早くよりオートマトン理論, リスト処理等の研究および紹介に貢献され, 現在はTraubなどの計算量理論, 数値解析を研究されています. また, 数学基礎論の上江洲忠弘先生もおられ, 基礎論の観点から情報数学へ助言・提言を頂いています.
  6. 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. 7. 圏論のモナド(1)•  圏(category)とは? 集合の圏, 群の圏, 連続束の圏, 位相空間の 圏, 関係の圏など•  関手(functor)とは? 構造を忘れる関手, 代数構造を自由生成する 関手など•  自然変換(natural transformation)とは? 関手で移された構造物間の射を一斉に与え る
  8. 8. 例 (HaskellのListとconcat)•  圏集合の圏(Set) (集合と写像の圏),リストの圏(List) (文字列と半群準同型の圏)A=Integer (整数全体の集合)•  L: Set → List は関手 LA=[A]1,2,3 ∈A, [1,2,3] ∈LAf: 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. 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. 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. 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. 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. 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. 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. 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 の定理が有名.
  16. 16. 講義ノート(1)
  17. 17. 講義ノート (2)
  18. 18. 講義ノート (3)
  19. 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. 20. Haskellのモナド(2)•  なぜモナドを使うのか? –  Kleisli圏の対象と考えられるデータ構造は, 必要な関 数(return,>>=)を定義して, モナドにしておくと良い. なぜ良いのか? –  プログラムが見やすくなる. –  構造に付随する部分と問題依存の部分とのプログラ ムを分割出来る. –  do文のsemanticsを関数型プログラミングの範疇で 与えることが出来る. –  圏論は数学のデザインパターン, デザインパターンを 使って、お行儀の良いプログラムを書きましょう.
  21. 21. Haskellのモナド(3)State Transformationf1 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. 22. Haskellのモナド(4)Type S s a = s → (s, a)>>=::S s a →(a→S s b)→S s bp >>= k = λs0 . let (s1,a)= p s0 % p: s→(s, a) q=ka % q: s→(s, b) in q s1return::a → S s areturn 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. 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. 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)

×