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)