gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:49:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com