Где конструктор данных для "состояния"?

Прочитав несколько учебников по монахам штата Haskell, я захотел попробовать их сам. В учебниках, которые я прочитал, утверждается, что Control.Monad.State предоставляет следующее определение:

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

Однако мне кажется, что мне трудно найти конструктор данных State:

Prelude> import Control.Monad.State
Prelude Control.Monad.State> :t State

<interactive>:1:1:
    Not in scope: data constructor `State'
    Perhaps you meant `StateT' (imported from Control.Monad.State)

Я также пробовал поиск в Google State, но не нашел никаких конструкторов данных с ожидаемым типом.

Где появился конструктор State? Он когда-нибудь существовал? Или я просто смотрю не туда? По сути, я хотел бы знать, что мне нужно сделать, чтобы создать государственную монаду.

Ответ 1

Он больше не существует. К сожалению, это приводит к тому, что многие ресурсы Haskell в Интернете устарели.

Чтобы создать значение, вы можете просто использовать функцию state:

state :: (s -> (a, s)) -> State s a

runState, который раньше был полем state, теперь является самой нормальной функцией, но работает так же, как и раньше.

state был переписан в терминах трансформатора StateT monad:

type State s = StateT s Identity

StateT сам имеет конструктор StateT, который очень похож на старый конструктор state:

newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }

Единственное отличие состоит в том, что есть дополнительный параметр m. Это всего лишь слот, в который вы можете добавить любую другую монаду, которая StateT затем расширяется с возможностями обработки состояния. Естественно, чтобы восстановить прежнюю функциональность state, вам просто нужно установить m в Identity, что ничего не делает.

newtype Identity a = Identity { runIdentity :: a }

Ответ 2

Некоторое время назад MTL переключался с

newtype State s a = State ...

к

type State s = StateT s Identity

поскольку в противном случае мы должны были дублировать логику для каждой монады и ее трансформатора. Вместо этого теперь вы можете использовать функцию state

state :: (s -> (a, s)) -> State s a

Печально RWH и LYAH оба устарели в этом отношении: (