Я получаю неоднозначное вхождение
Действительно, давайте попробуем код, который вы разместили ..
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 ()