Где конструктор данных для "состояния"?
Прочитав несколько учебников по монахам штата 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 оба устарели в этом отношении: (