stateモナドの解説 中編
TRANSCRIPT
![Page 1: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/1.jpg)
Stateモナドの解説中編
2009年5月31日 id:hiratara
2009年5月31日日曜日
![Page 2: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/2.jpg)
はじめに
• モナドは元の型の世界を新しい型の世界に移す世界 = 型 + 関数
• Stateモナドの世界を解説する
2009年5月31日日曜日
![Page 3: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/3.jpg)
(1) Stateの世界の型
2009年5月31日日曜日
![Page 4: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/4.jpg)
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日日曜日
![Page 5: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/5.jpg)
通常の世界の型の値はこんな感じ
String State Int String
State Intモナド
"ABC""12345""hoge"
Int State Int Int
State Intモナド
2368974
2009年5月31日日曜日
![Page 6: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/6.jpg)
では、State 型の値は?
String State Int String
State Intモナド
"ABC""12345""hoge"
Int State Int Int
State Intモナド
2368974
??????
???
???
???
2009年5月31日日曜日
![Page 7: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/7.jpg)
副作用のある計算counter = 0
def chars(char): global counter counter += 1 return char * counter
例えばこんなの。A). counter によって、結果が異なる。B). 実行すると counter が 1 増える。
2009年5月31日日曜日
![Page 8: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/8.jpg)
副作用のある計算
例えばこんなの。A). counter によって、結果が異なる。B). 実行すると counter が 1 増える。
このA)とB)を満たせるものをState型の値とする
2009年5月31日日曜日
![Page 9: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/9.jpg)
A). 状態で値が変わる全ての状態に関して、値を持ってればいい
123
...
"a""aa""aaa"
状態 答
これを一つの値とみなす
2009年5月31日日曜日
![Page 10: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/10.jpg)
B). 状態が変わるどの状態に変わるかも返せばよい
123
...
("a", 2)("aa", 3)("aaa", 4)
状態 答
これを一つの値とみなす
2009年5月31日日曜日
![Page 11: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/11.jpg)
なので、これを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日日曜日
![Page 12: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/12.jpg)
これは、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日日曜日
![Page 13: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/13.jpg)
State の正体が関数であることがわかったので、表記を以下のようにする。
123 ...
("*", 2)("**", 3)("***", 4)
Int -> (String, Int)
(v(s0), s(s0))状態がs0の時に、値がv(s0)、次の状態がs(s0)となる値
⇔
⇔ (‘*’ を s0個, s0 + 1)
例:
2009年5月31日日曜日
![Page 14: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/14.jpg)
(2) returnの定義
2009年5月31日日曜日
![Page 15: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/15.jpg)
returnは元の世界の値の、Stateの世界の値への対応
String State Int String
State Intモナド
"ABC""12345"
Int State Int Int
State Intモナド
236
??????
???
???
???
return
return
2009年5月31日日曜日
![Page 16: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/16.jpg)
元の世界は状態がない世界なので、状態によらず値は一定&次の状態は前の状態のまま
String State Int String
State Intモナド
"ABC""12345"
Int State Int Int
State Intモナド
236
??????
???
???
???
return
return
2009年5月31日日曜日
![Page 17: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/17.jpg)
なので、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日日曜日
![Page 18: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/18.jpg)
【注意】元の世界と対応しない値もたくさんある。 これらは、モナドによって拡張された値。
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日日曜日
![Page 19: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/19.jpg)
まとめ• State型の値は、状態s0に対して、
s0の時にとる値v(s0)と、s0の次にとる状態s(s0)の、2つの値を返す関数となる
• 元の値 a は、State型の中では (a, s0) で表される ( return の定義 )
2009年5月31日日曜日
![Page 20: Stateモナドの解説 中編](https://reader033.vdocuments.pub/reader033/viewer/2022042512/55795c23d8b42ab6648b4f6c/html5/thumbnails/20.jpg)
そして後編へ• Stateモナドの世界の値はわかった
• 後は、元の世界の関数がStateモナドの世界で使えれば、Stateモナドの世界に関数を用意しなくても勝手に世界が完成する!!
• 後編では、元の世界の関数をStateモナドの世界に持って行く ( >>= の定義 )
2009年5月31日日曜日