2012-03-14 4 views
12

나는 Learn You a Haskell's guide on the state monad을 읽고 있었지만 스택 예제가 컴파일되지 않았기 때문에 이해하는 데 어려움이있었습니다. 이 가이드에서 그는 다음 코드를 사용했습니다.상태 모나드 및 learnyouahaskell.com

import Control.Monad.State 

type Stack = [Int] 

pop :: State Stack Int 
pop = State $ \(x:xs) -> (x,xs) 

push :: Int -> State Stack() 
push a = State $ \xs -> ((),a:xs) 

내가하는 일을 이해하고 있지만 컴파일되지 않습니다. 나는 이유를 모른다. 오류 메시지는이 사실, 내 지식입니다 "주"때문에, 나에게

newtype State s a = State { runState :: s -> (a,s) } 

로 정의 된 데이터 생성자를, 말이 안 가이드 "잘못"인가

Stack.hs:6:7: Not in scope: data constructor `State' 

Stack.hs:9:10: Not in scope: data constructor `State' 

, 그렇다면 어떻게 수정해야합니까?

+5

'Control.Monad.State'는'State' 생성자를 export하지 않고'state' (소문자's')를 사용합니다. – Vitus

+0

@Vitus 니스, [그 기능] (http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-Trans-State-Lazy.html#v)을 몰랐습니다. : 주)가 수출되었습니다. 나는 당신이 코멘트가 아닌 대답으로 써야한다고 생각합니다. – danr

+0

@Vitus : 그 코드는 실제로 컴파일되고 Windows의 GHCI 6.12.3에서 잘 실행되기 때문에 이상합니다. –

답변

18

의견에서 언급했듯이 State 대신 state을 사용해야합니다.


문제 State 독립 데이터 유형 (또는 오히려 newtype)는 아니지만, Identity 모나드에인가 StateT 변압기이다. 사실, 그것은

type State s = StateT s Indentity 

로 정의 그리고 그것은 단지 type 동의어이기 때문에, 그것은 State 생성자를 가질 수 없습니다. 그래서 Control.Monad.Statestate을 사용합니다.

+0

그것은 지금 컴파일된다 :) 대단히 고마워! – Undreren

+0

더 이상 작동하지 않습니다. 누구든지 적절한 구문을 알고 있습니까? –

관련 문제