Haskell的State Monad在哪里?我如何使用它?

Haskell的State Monad在哪里?我如何使用它?,haskell,monads,monad-transformers,Haskell,Monads,Monad Transformers,我正在学习State Monad,有人告诉我它已经不存在了,第一个问题是Haskell为什么要删除它 当我使用 导入Data.Functor.Identity 进口管制.单子.跨州 类型states=StateT的标识 我明白了 “状态”出现不明确 它可以参考 “Control.Monad.Trans.State.State” 或“主要州”, 但当我尝试:t状态时,我什么也找不到。 这是自相矛盾的,我不知道它是否存在 最后,我自己写的 newtype State sa=状态{runState::

我正在学习State Monad,有人告诉我它已经不存在了,第一个问题是Haskell为什么要删除它

当我使用

导入Data.Functor.Identity 进口管制.单子.跨州 类型states=StateT的标识 我明白了

“状态”出现不明确 它可以参考 “Control.Monad.Trans.State.State” 或“主要州”, 但当我尝试:t状态时,我什么也找不到。 这是自相矛盾的,我不知道它是否存在

最后,我自己写的

newtype State sa=状态{runState::s->a,s} 但是我还需要一些其他的函数,比如put,get。。。他们在哪里

使用:我得到,我找到MonadState,这是状态的新实现吗

我得到了不明确的结果

真的,让我们试试你发布的代码

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

type State s = StateT s Identity
EOF
ghci umi.hs
所以这其实很好。我怀疑您有更多的代码试图使用状态,但它是不明确的,因为您已经导入了一个状态,并且不需要定义自己的状态类型

当我尝试:t State时,我什么也找不到。这是自相矛盾的

当你尝试:t声明你得到的不仅仅是什么,你得到的是:

:t State

<interactive>:1:1: error:
    • Data constructor not in scope: State
您可以看到,主电源类型别名与从Control.Monad.Trans.State导入的类型别名是冗余的。解决方案只是不要定义类型别名

编辑:以上是为了澄清一些误解。在这里回答你的实际问题

国家单子在哪里

Haskell库中定义了许多状态单子。最流行的是您已经找到的transformers包中的Control.Monad.Trans.State。还有monadlib版本的State,以及mtl包中完全不同的MonadState类,它是对任何具有某种状态概念的monad的get和set操作

我怎么用呢

您可以导入模块并运行stateManadicOperation initialState:

如果您有具体的问题,可以在stackoverflow上找到许多状态单子问题

我想知道它是否存在

这取决于你问题中的it。存在状态类型构造函数,但没有状态数据构造函数

使用:我得到,我找到MonadState,这是状态的新实现吗

否。请说明单子在转换器中定义为:

type State s = StateT s Data.Functor.Identity.Identity :: * -> *
newtype StateT s (m :: * -> *) a
  = StateT {runStateT :: s -> m (a, s)}
所以有一个带有数据构造函数和类型别名transformer和identity monad的transformer

相比之下,MonadState只是获取和设置值能力的抽象:

class Monad m => MonadState s (m :: * -> *) | m -> s where
  get :: m s
  put :: s -> m ()
我得到了不明确的结果

真的,让我们试试你发布的代码

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

type State s = StateT s Identity
EOF
ghci umi.hs
所以这其实很好。我怀疑您有更多的代码试图使用状态,但它是不明确的,因为您已经导入了一个状态,并且不需要定义自己的状态类型

当我尝试:t State时,我什么也找不到。这是自相矛盾的

当你尝试:t声明你得到的不仅仅是什么,你得到的是:

:t State

<interactive>:1:1: error:
    • Data constructor not in scope: State
您可以看到,主电源类型别名与从Control.Monad.Trans.State导入的类型别名是冗余的。解决方案只是不要定义类型别名

编辑:以上是为了澄清一些误解。在这里回答你的实际问题

国家单子在哪里

Haskell库中定义了许多状态单子。最流行的是您已经找到的transformers包中的Control.Monad.Trans.State。还有monadlib版本的State,以及mtl包中完全不同的MonadState类,它是对任何具有某种状态概念的monad的get和set操作

我怎么用呢

您可以导入模块并运行stateManadicOperation initialState:

如果您有具体的问题,可以在stackoverflow上找到许多状态单子问题

我想知道它是否存在

这取决于你问题中的it。存在状态类型构造函数,但没有状态数据构造函数

使用:我得到,我找到MonadState,这是状态的新实现吗

否。请说明单子在转换器中定义为:

type State s = StateT s Data.Functor.Identity.Identity :: * -> *
newtype StateT s (m :: * -> *) a
  = StateT {runStateT :: s -> m (a, s)}
所以有一个带有数据构造函数和类型别名transformer和identity monad的transformer

相比之下,MonadState只是获取和设置值能力的抽象:

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

是的,状态类型构造函数不再存在。而是使用MonadState类型类中的state函数。为了进一步检查,你说你被告知州单子“不再存在”。我认为值得指出的是,这并不完全正确。作为独立单子的状态不再存在,但状态单子仍然存在;但是,它是根据另一个StateT monad定义的,而不是作为单独的monad实现的。这个新的状态是单子生存的状态
在Control.Monad.Trans.State模块中的transformers库中。编辑:我刚刚注意到你已经知道Control.Monad.Trans.State了-很抱歉重复了这么多评论!是的,状态类型构造函数不再存在。而是使用MonadState类型类中的state函数。为了进一步检查,你说你被告知州单子“不再存在”。我认为值得指出的是,这并不完全正确。作为独立单子的状态不再存在,但状态单子仍然存在;但是,它是根据另一个StateT monad定义的,而不是作为单独的monad实现的。这个新状态monad位于transformers库的Control.monad.Trans.state模块中。编辑:我刚刚注意到你已经知道Control.Monad.Trans.State了-很抱歉重复了这么多评论!可能值得明确指出的是,在monad transformer定义下,runState只是一个定义为\m->runIdentity的函数,而不是特定状态类型中的字段名。runStateT m,隐藏StateT生成的标识值的必要展开。喜欢你的小mapM runstate示例!可能值得明确指出的是,在monad transformer定义下,runState只是一个定义为\m->runIdentity的函数,而不是特定状态类型中的字段名。runStateT m,隐藏StateT生成的标识值的必要展开。喜欢你的小mapM runstate示例!