読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

Stateモナド使ってみる

haskell

State モナドを使ってみる。

import Control.Monad.State

すると使えるようになる。

State モナド

State s a

みたいになっているらしい。 s が状態で a が状態付き計算の結果。
実際使うときには

\s -> (a, s)

を state で包んでやればいいらしい。
とりあえず書いてみたもののさっぱり意味がわからない。

Stateモナドをつかってスタックを作ってみる。
push と pop は

push :: a -> State [a] ()
push x = state $ \xs -> ((), x:xs)

pop :: State [a] a
pop = state $ \(x:xs) -> (x, xs)

見たいに書くといい。使い方は

stackExample :: State [Int] Int
stackExample = do
  push 1
  push 2
  push 3
  pop
  push 4
  x <- pop
  return x
>>> runState stackExample []
(4,[2,1])

こんな感じ。runState に Stateモナドの値と状態の初期値を与える。

あと、Control.Monad.State には 状態を取ってくる get と 状態を書き換える put というのがある。
それを使うとさっきの push と pop は

push :: a -> State [a] ()
push x = do
  xs <- get
  put (x:xs)

pop :: State [a] a
pop = do
  (x:xs) <- get
  put xs
  return x

のように書ける。こっちのほうが分かりやすい気がする。