Где находится государственная монада в Хаскеле, и как я могу ее использовать? - PullRequest
0 голосов
/ 20 октября 2019

Я изучаю State Monad, и мне сказали, что его больше не существует, первый вопрос: почему Haskell удаляет его?

и когда я использую

import Data.Functor.Identity
import Control.Monad.Trans.State

type State s = StateT s Identity

Iget

Ambiguous occurrence ‘State’
    It could refer to
       either ‘Control.Monad.Trans.State.State’
           or ‘Main.State’,

но когда я попробовал :t State, я ничего не нашел. Это противоречиво, мне интересно, существует ли оно или нет?

наконец, я пишу это самостоятельно

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

, но мне также нужна какая-то другая функция, такая как put, get ... где они.

с использованием :i get, я обнаружил MonadState, это новый инструмент State?

1 Ответ

9 голосов
/ 20 октября 2019

Я получаю неоднозначное вхождение

Действительно, давайте попробуем код, который вы разместили ..

cat <<EOF >umi.hs
import Data.Functor.Identity
import Control.Monad.Trans.State

type State s = StateT s Identity
EOF
ghci umi.hs

Мы получаем

Ok, one module loaded.

Итакэто на самом деле хорошо. Я подозреваю, что у вас есть больше кода, который пытается использовать State, но это неоднозначно, потому что вы импортировали State и вам не нужно определять свой собственный тип State.

Когда я пыталсяСостояние, я ничего не нахожу. Это противоречиво

Когда вы пытаетесь :t State, вы получаете больше, чем ничего, вы получаете:

:t State

<interactive>:1:1: error:
    • Data constructor not in scope: State

Внимательно прочитайте, там написано "Конструктор данных" нет "тип "или" конструктор типа ". Вы не можете проверить тип типа (:t меньше :type). Однако вы можете использовать информацию:

> :i State
type Control.Monad.Trans.State.State s =
  StateT s Identity :: * -> *
        -- Defined in ‘Control.Monad.Trans.State.Lazy’

type Main.State s = StateT s Identity :: * -> *
        -- Defined at umi.hs:4:5

Итак, вы видите, что ваш (Main s) псевдоним типа является избыточным из псевдонима типа, который вы импортировали из Control.Monad.Trans.State. Решение? Только не определяйте свой псевдоним типа.

РЕДАКТИРОВАТЬ: Вышеприведенное предназначалось для устранения некоторых недоразумений. Отвечая на ваши актуальные вопросы здесь.

Где находится монада состояний

В библиотеках Haskell определено много монад состояний. Самый популярный из них - Control.Monad.Trans.State из пакета transformers, который вы уже нашли. Также существует версия State для monadlib и совершенно другой класс MonadState (в пакете mtl), который представляет собой пару операций get и set для любой монады, которая имеет некоторое представление о состоянии.

и как я могу его использовать?

Ну, вы импортируете модуль, и вы можете runState stateMonadicOperation initialState:

> runState (mapM (\x -> state $ \s -> (x,s+x)) [1..4])  9
([1,2,3,4],19)

Есть много вопросов монады состоянияВы можете найти здесь на stackoverflow, если у вас есть конкретные вопросы.

Интересно, существует ли он или нет?

Это зависит от it в вашем вопросе. Существует конструктор типа State, но нет конструктора данных State.

с использованием: я понял, я обнаружил MonadState, это новая реализация State?

Нет. State Монада определена в трансформерах как:

type State s = StateT s Data.Functor.Identity.Identity :: * -> *
newtype StateT s (m :: * -> *) a
  = StateT {runStateT :: s -> m (a, s)}

Таким образом, существует преобразователь с конструктором данных и псевдонимом типа преобразователя и идентификационной монады.

Напротив,MonadState - это просто абстракция способности получать и устанавливать значения:

class Monad m => MonadState s (m :: * -> *) | m -> s where
  get :: m s
  put :: s -> m ()
...