stateモナドの解説 中編

20
Stateモナドの解説 中編 2009531id:hiratara 2009531日日曜日

Upload: masahiro-honma

Post on 11-Jun-2015

975 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Stateモナドの解説 中編

Stateモナドの解説中編

2009年5月31日 id:hiratara

2009年5月31日日曜日

Page 2: Stateモナドの解説 中編

はじめに

• モナドは元の型の世界を新しい型の世界に移す世界 = 型 + 関数

• Stateモナドの世界を解説する

2009年5月31日日曜日

Page 3: Stateモナドの解説 中編

(1) Stateの世界の型

2009年5月31日日曜日

Page 4: Stateモナドの解説 中編

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モナドの解説 中編

通常の世界の型の値はこんな感じ

String State Int String

State Intモナド

"ABC""12345""hoge"

Int State Int Int

State Intモナド

2368974

2009年5月31日日曜日

Page 6: Stateモナドの解説 中編

では、State 型の値は?

String State Int String

State Intモナド

"ABC""12345""hoge"

Int State Int Int

State Intモナド

2368974

??????

???

???

???

2009年5月31日日曜日

Page 7: Stateモナドの解説 中編

副作用のある計算counter = 0

def chars(char): global counter counter += 1 return char * counter

例えばこんなの。A). counter によって、結果が異なる。B). 実行すると counter が 1 増える。

2009年5月31日日曜日

Page 8: Stateモナドの解説 中編

副作用のある計算

例えばこんなの。A). counter によって、結果が異なる。B). 実行すると counter が 1 増える。

このA)とB)を満たせるものをState型の値とする

2009年5月31日日曜日

Page 9: Stateモナドの解説 中編

A). 状態で値が変わる全ての状態に関して、値を持ってればいい

123

...

"a""aa""aaa"

状態 答

これを一つの値とみなす

2009年5月31日日曜日

Page 10: Stateモナドの解説 中編

B). 状態が変わるどの状態に変わるかも返せばよい

123

...

("a", 2)("aa", 3)("aaa", 4)

状態 答

これを一つの値とみなす

2009年5月31日日曜日

Page 11: Stateモナドの解説 中編

なので、これを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モナドの解説 中編

これは、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モナドの解説 中編

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モナドの解説 中編

(2) returnの定義

2009年5月31日日曜日

Page 15: Stateモナドの解説 中編

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モナドの解説 中編

元の世界は状態がない世界なので、状態によらず値は一定&次の状態は前の状態のまま

String State Int String

State Intモナド

"ABC""12345"

Int State Int Int

State Intモナド

236

??????

???

???

???

return

return

2009年5月31日日曜日

Page 17: Stateモナドの解説 中編

なので、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モナドの解説 中編

【注意】元の世界と対応しない値もたくさんある。    これらは、モナドによって拡張された値。

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モナドの解説 中編

まとめ• State型の値は、状態s0に対して、

s0の時にとる値v(s0)と、s0の次にとる状態s(s0)の、2つの値を返す関数となる

• 元の値 a は、State型の中では (a, s0) で表される ( return の定義 )

2009年5月31日日曜日

Page 20: Stateモナドの解説 中編

そして後編へ• Stateモナドの世界の値はわかった

• 後は、元の世界の関数がStateモナドの世界で使えれば、Stateモナドの世界に関数を用意しなくても勝手に世界が完成する!!

• 後編では、元の世界の関数をStateモナドの世界に持って行く ( >>= の定義 )

2009年5月31日日曜日