Download - Stateモナドの解説 中編
Stateモナドの解説中編
2009年5月31日 id:hiratara
2009年5月31日日曜日
はじめに
• モナドは元の型の世界を新しい型の世界に移す世界 = 型 + 関数
• Stateモナドの世界を解説する
2009年5月31日日曜日
(1) Stateの世界の型
2009年5月31日日曜日
Stateモナドの世界を知る → まず型を知ること
String
Int
MyType
Maybe Bool
State Int String
State Int Int
State Int MyType
State Int (Maybe Bool)
State Intモナド
State Intモナド
State Intモナド
State Intモナド
2009年5月31日日曜日
通常の世界の型の値はこんな感じ
String State Int String
State Intモナド
"ABC""12345""hoge"
Int State Int Int
State Intモナド
2368974
2009年5月31日日曜日
では、State 型の値は?
String State Int String
State Intモナド
"ABC""12345""hoge"
Int State Int Int
State Intモナド
2368974
??????
???
???
???
2009年5月31日日曜日
副作用のある計算counter = 0
def chars(char): global counter counter += 1 return char * counter
例えばこんなの。A). counter によって、結果が異なる。B). 実行すると counter が 1 増える。
2009年5月31日日曜日
副作用のある計算
例えばこんなの。A). counter によって、結果が異なる。B). 実行すると counter が 1 増える。
このA)とB)を満たせるものをState型の値とする
2009年5月31日日曜日
A). 状態で値が変わる全ての状態に関して、値を持ってればいい
123
...
"a""aa""aaa"
状態 答
これを一つの値とみなす
2009年5月31日日曜日
B). 状態が変わるどの状態に変わるかも返せばよい
123
...
("a", 2)("aa", 3)("aaa", 4)
状態 答
これを一つの値とみなす
2009年5月31日日曜日
なので、これをState Int String 型の値とする
chars ‘b’ =
chars ‘*’
chars ‘ ’
=
=
123 ...
("b", 2)("bb", 3)("bbb", 4)
123 ...
("*", 2)("**", 3)("***", 4)
123 ...
(" ", 2)(" ", 3)(" ", 4)
値
値
値
2009年5月31日日曜日
これは、State の定義と一致する
123 ...
("*", 2)("**", 3)("***", 4)
ghci> :i Statenewtype State s a = State {runState :: s -> (a, s)}
Int -> (String, Int)State Int String ⇔
2009年5月31日日曜日
State の正体が関数であることがわかったので、表記を以下のようにする。
123 ...
("*", 2)("**", 3)("***", 4)
Int -> (String, Int)
(v(s0), s(s0))状態がs0の時に、値がv(s0)、次の状態がs(s0)となる値
⇔
⇔ (‘*’ を s0個, s0 + 1)
例:
2009年5月31日日曜日
(2) returnの定義
2009年5月31日日曜日
returnは元の世界の値の、Stateの世界の値への対応
String State Int String
State Intモナド
"ABC""12345"
Int State Int Int
State Intモナド
236
??????
???
???
???
return
return
2009年5月31日日曜日
元の世界は状態がない世界なので、状態によらず値は一定&次の状態は前の状態のまま
String State Int String
State Intモナド
"ABC""12345"
Int State Int Int
State Intモナド
236
??????
???
???
???
return
return
2009年5月31日日曜日
なので、Stateの世界ではこうなる。
String State Int String
State Intモナド
"ABC""12345"
Int State Int Int
State Intモナド
236
(“ABC”, s0)
(“12345, s0)???
(236, s0)
???
return
return
2009年5月31日日曜日
【注意】元の世界と対応しない値もたくさんある。 これらは、モナドによって拡張された値。
String State Int String
State Intモナド
"ABC""12345"
Int State Int Int
State Intモナド
236
(“ABC”, s0)
(“12345, s0)(v(s0), s(s0))
(236, s0)
return
return
(v’(s0), s’(s0))2009年5月31日日曜日
まとめ• State型の値は、状態s0に対して、
s0の時にとる値v(s0)と、s0の次にとる状態s(s0)の、2つの値を返す関数となる
• 元の値 a は、State型の中では (a, s0) で表される ( return の定義 )
2009年5月31日日曜日
そして後編へ• Stateモナドの世界の値はわかった
• 後は、元の世界の関数がStateモナドの世界で使えれば、Stateモナドの世界に関数を用意しなくても勝手に世界が完成する!!
• 後編では、元の世界の関数をStateモナドの世界に持って行く ( >>= の定義 )
2009年5月31日日曜日