haskell - 'State' 的数据构造函数在哪里?

标签 haskell monads

在阅读了一些关于 Haskell 状态 monad 的教程后,我想自己尝试一下。我读过的教程声称 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)

我还尝试了 Hoogle 搜索 State 但没有找到任何具有预期类型的​​数据构造函数。

State 构造函数去了哪里?它曾经存在过吗?或者我只是找错地方了?本质上我想知道我需要做什么来创建一个状态单子(monad)。

最佳答案

它已经不存在了。不幸的是,这使得网络上许多关于它的 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。这只是一个插槽,您可以在其中添加任何其他 monad,然后 StateT 会扩展状态处理功能。当然,要恢复 State 的旧功能,您只需将 m 设置为 Identity,这不会执行任何操作。

newtype Identity a = Identity { runIdentity :: a }

关于haskell - 'State' 的数据构造函数在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103108/

相关文章:

haskell - 欧拉计划 8 - 我不明白

haskell - 为什么 IO 是单子(monad)而不是共单子(monad)?

haskell - MonadBaseControl : how to lift simpleHTTP from Happstack?

haskell - Haskell中do block 中 `<-`的含义

haskell - .. 在哪里定义?

list - Haskell 列表理解 0's and 1' s

haskell - Haskell 中非空叶树的应用实例

haskell - 在 Haskell 中使用哪个 monad 来聚合执行一系列语句时可能发生的异常?

haskell - Writer Monad 是否保证右关联连接?

haskell - 在 SBV 中组合元组?