StateモナドとContinuationモナド

30分プログラム、その70。
StateモナドとContinuationモナドを勉強しよう。

import Control.Monad.State
import Control.Monad.Cont

randomUpdate :: Int->Int->Int->(Int,Int)
randomUpdate p q a = let value = a*p+q in
                     (value,value `mod` 1000)

random :: State Int Int
random = do seed <- get
            let (value,seed') = randomUpdate 3 10 seed
            put seed'
            return value

run = fst $ runState f 10
    where f = do a <- random
                 b <- random
                 c <- random
                 return [a,b,c]

ccTest n = runCont f id
    where f  = do str <- callCC $ \ret-> do when(n<10) (ret "small than 10")
                                            return "over 10"
                  return str

All About Monadsを写しただけな気がする。
Stateモナドはともかく、Continuationモナドはなんとなくしかわかんない。

  1. 正規表現のパースにはバックトラックが必要
  2. バックトラックといえば継続
  3. Haskellで継続といえば、Continuationモナド

という動機だったんだけど、今考えるとListモナドでいいような気がしてきた。