Подтвердить что ты не робот

Государственная монада и learnyouahaskell.com

Я читал Узнал ли вы руководство Haskell о государственной монаде, но мне было трудно понять его, поскольку пример стека не смог скомпилировать. В руководстве он использовал следующий фрагмент кода:

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) 

Пока я понимаю, что он должен делать, он не будет компилироваться. Понятия не имею почему. Сообщение об ошибке:

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

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

Это не имеет для меня никакого смысла, поскольку "State", насколько мне известно, фактически является конструктором данных, который определяется как

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

Является ли руководство "неправильным", и если да, то как его исправить?

4b9b3361

Ответ 1

Как я уже упоминал в комментариях, вы должны использовать state вместо state.


Проблема заключается в том, что state не является автономным типом данных (а точнее newtype), но это трансформатор StateT применяется к Identity monad. Фактически, он определяется как

type State s = StateT s Indentity

и потому что это просто синтаксис type, он не может иметь конструктор state. Поэтому Control.Monad.State использует state.