SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
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)

Weitere ähnliche Inhalte

Was ist angesagt?

大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
Takuya Akiba
 

Was ist angesagt? (20)

自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
 
行列計算を利用したデータ解析技術
行列計算を利用したデータ解析技術行列計算を利用したデータ解析技術
行列計算を利用したデータ解析技術
 
定理証明支援系Coqについて
定理証明支援系Coqについて定理証明支援系Coqについて
定理証明支援系Coqについて
 
私を SKI に連れてって
私を SKI に連れてって私を SKI に連れてって
私を SKI に連れてって
 
圏論とHaskellは仲良し
圏論とHaskellは仲良し圏論とHaskellは仲良し
圏論とHaskellは仲良し
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使う
 
ブースティング入門
ブースティング入門ブースティング入門
ブースティング入門
 
グラフデータの機械学習における特徴表現の設計と学習
グラフデータの機械学習における特徴表現の設計と学習グラフデータの機械学習における特徴表現の設計と学習
グラフデータの機械学習における特徴表現の設計と学習
 
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
Coqチュートリアル
CoqチュートリアルCoqチュートリアル
Coqチュートリアル
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
 
ラムダ計算入門
ラムダ計算入門ラムダ計算入門
ラムダ計算入門
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
よくわかるCoqプログラミング
よくわかるCoqプログラミングよくわかるCoqプログラミング
よくわかるCoqプログラミング
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
劣モジュラ最適化と機械学習1章
劣モジュラ最適化と機械学習1章劣モジュラ最適化と機械学習1章
劣モジュラ最適化と機械学習1章
 
計算量
計算量計算量
計算量
 

Andere mochten auch

プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
 

Andere mochten auch (9)

TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
TeX言語の展開制御による文書の構造化(TeXユーザの集い2014)
 
Macrodown -MLが使えるML-
Macrodown -MLが使えるML-Macrodown -MLが使えるML-
Macrodown -MLが使えるML-
 
プログラミングTeX
プログラミングTeXプログラミングTeX
プログラミングTeX
 
圏論 3分(?) クッキング
圏論 3分(?) クッキング圏論 3分(?) クッキング
圏論 3分(?) クッキング
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 

Ähnlich wie 圏論のモナドとHaskellのモナド

Ähnlich wie 圏論のモナドとHaskellのモナド (20)

Introduction to Categorical Programming
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical Programming
 
代数的実数とCADの実装紹介
代数的実数とCADの実装紹介代数的実数とCADの実装紹介
代数的実数とCADの実装紹介
 
Coq関係計算ライブラリの開発と写像の性質の証明
Coq関係計算ライブラリの開発と写像の性質の証明Coq関係計算ライブラリの開発と写像の性質の証明
Coq関係計算ライブラリの開発と写像の性質の証明
 
複素数・四元数と図形の回転
複素数・四元数と図形の回転複素数・四元数と図形の回転
複素数・四元数と図形の回転
 
トピックモデル
トピックモデルトピックモデル
トピックモデル
 
リストモナドを作ってみた
リストモナドを作ってみたリストモナドを作ってみた
リストモナドを作ってみた
 
第5章 拡張モデル(前半)
第5章 拡張モデル(前半)第5章 拡張モデル(前半)
第5章 拡張モデル(前半)
 
ベイズ推論による機械学習入門 第4章
ベイズ推論による機械学習入門 第4章ベイズ推論による機械学習入門 第4章
ベイズ推論による機械学習入門 第4章
 
Stochastic Variational Inference
Stochastic Variational InferenceStochastic Variational Inference
Stochastic Variational Inference
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
 
Operad and Recognition Principle
Operad and Recognition PrincipleOperad and Recognition Principle
Operad and Recognition Principle
 
Proof summit2014mizar
Proof summit2014mizarProof summit2014mizar
Proof summit2014mizar
 
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみたScala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
 
topology of musical data
topology of musical datatopology of musical data
topology of musical data
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
MP in Scala
MP in ScalaMP in Scala
MP in Scala
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
【第34回数学カフェの予習会#1】微分と代数学のつながり
【第34回数学カフェの予習会#1】微分と代数学のつながり【第34回数学カフェの予習会#1】微分と代数学のつながり
【第34回数学カフェの予習会#1】微分と代数学のつながり
 
4thNLPDL
4thNLPDL4thNLPDL
4thNLPDL
 
代数トポロジー入門
代数トポロジー入門代数トポロジー入門
代数トポロジー入門
 

Mehr von Yoshihiro Mizoguchi

Mehr von Yoshihiro Mizoguchi (20)

DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築DockerでAlmaLinux(web, php, pukiwiki)環境構築
DockerでAlmaLinux(web, php, pukiwiki)環境構築
 
DockerでCoq インストール
DockerでCoq インストールDockerでCoq インストール
DockerでCoq インストール
 
Homebrewによるソフトウェアの実装 (3)
Homebrewによるソフトウェアの実装 (3)Homebrewによるソフトウェアの実装 (3)
Homebrewによるソフトウェアの実装 (3)
 
Homebrewによるソフトウェアの実装 (2)
Homebrewによるソフトウェアの実装 (2)Homebrewによるソフトウェアの実装 (2)
Homebrewによるソフトウェアの実装 (2)
 
Homebrewによるソフトウェアの実装(1)
Homebrewによるソフトウェアの実装(1)Homebrewによるソフトウェアの実装(1)
Homebrewによるソフトウェアの実装(1)
 
Overleafを使った文書作成
Overleafを使った文書作成Overleafを使った文書作成
Overleafを使った文書作成
 
Amazon AWSの使い方
Amazon AWSの使い方Amazon AWSの使い方
Amazon AWSの使い方
 
ShareLaTeXの使い方
ShareLaTeXの使い方ShareLaTeXの使い方
ShareLaTeXの使い方
 
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional O...
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional  O...Symbolic Computations in Conformal Geometric Algebra for Three Dimensional  O...
Symbolic Computations in Conformal Geometric Algebra for Three Dimensional O...
 
Theory of Relational Calculus and its Formalization
Theory of Relational Calculus and its FormalizationTheory of Relational Calculus and its Formalization
Theory of Relational Calculus and its Formalization
 
数式処理ソフトMathematicaで数学の問題を解く
数式処理ソフトMathematicaで数学の問題を解く数式処理ソフトMathematicaで数学の問題を解く
数式処理ソフトMathematicaで数学の問題を解く
 
Verification of a brick wang tiling algorithm
Verification of a brick wang tiling algorithmVerification of a brick wang tiling algorithm
Verification of a brick wang tiling algorithm
 
計算機を用いて数学の問題を解くということ
計算機を用いて数学の問題を解くということ計算機を用いて数学の問題を解くということ
計算機を用いて数学の問題を解くということ
 
A Coq Library for the Theory of Relational Calculus
A Coq Library for the Theory of Relational CalculusA Coq Library for the Theory of Relational Calculus
A Coq Library for the Theory of Relational Calculus
 
Algebras for programming languages
Algebras for programming languagesAlgebras for programming languages
Algebras for programming languages
 
Mac bookでwebサーバーを起動する方法
Mac bookでwebサーバーを起動する方法Mac bookでwebサーバーを起動する方法
Mac bookでwebサーバーを起動する方法
 
有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について有限オートマトンとスティッカー系に関するCoqによる形式証明について
有限オートマトンとスティッカー系に関するCoqによる形式証明について
 
計算可能実数とは
計算可能実数とは計算可能実数とは
計算可能実数とは
 
グラフデータ構造と5色定理
グラフデータ構造と5色定理グラフデータ構造と5色定理
グラフデータ構造と5色定理
 
Graph partitioning and characteristic polynomials of Laplacian matrics of Roa...
Graph partitioning and characteristic polynomials of Laplacian matrics of Roa...Graph partitioning and characteristic polynomials of Laplacian matrics of Roa...
Graph partitioning and characteristic polynomials of Laplacian matrics of Roa...
 

圏論のモナドと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)