在阅读了一些关于 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/