2012-02-29 3 views
0

부분적으로이 부분은 http://www.haskell.org/haskellwiki/State_Monad 입니다. 그러나 c 및 f의 초기 상태를 어떻게 정의 할 지 명확하지 않습니다.State Monad에서 초기 상태를 어떻게 정의합니까?

IORefs와 함께 작동하지만 글로벌 변경 가능 데이터가 필요하지 않습니다.

plusOne n = return (n+1) 

당신이있어 이후 : StateT 작업 할 때

increment :: StateT Integer IO Integer 
increment = do 
     n <- get 
     put (n+1) 
     return n 

plusOne :: Integer -> IO Integer 
plusOne n = execStateT increment n 

printTChan mtch = do 
     forever $ do 
     m <- atomically $ readTChan mtch 
     case m of 
      "ping" -> plusOne c 
      _ -> plusOne f 
     print (c) 
+2

'runState'을 보았습니까? – Ingo

답변

7

, 당신은 그래서 당신은 무엇을이 글을 쓰는 단지 멋진 방법이, 국가의 범위를 표시로 run/eval/execStateT 생각할 수 이러한 행동의 결과를 무시하면 아무런 효과가 없습니다.

printTChan mtch = flip evalStateT (c0, f0) $ do 
    forever $ do 
     m <- liftIO . atomically $ readTChan mtch 
     case m of 
      "ping" -> modify incrementC 
      _  -> modify incrementF 
     (c, f) <- get 
     liftIO $ print c 

incrementC (c, f) = (c+1, f) 
incrementF (c, f) = (f, c+1) 

을 이제 장소에 초기 상태의 값을 입력 할 수 있습니다 : 당신이 당신의 전체 계산을 통해 상태를 수행하려면 모든 일이 StateT에서 실행되도록

, 당신은 당신의 코드를 구성 할 필요가 (c0, f0)

관련 문제