haskell - 状态单子(monad)和 learnyouahaskell.com

标签 haskell monads

我正在阅读 Learn You a Haskell's guide on the state monad ,但由于堆栈示例无法编译,因此我无法理解它。在指南中,他使用了以下代码:

import Control.Monad.State  

type Stack = [Int]

pop :: State Stack Int  
pop = State $ \(x:xs) -> (x,xs)  

push :: Int -> State Stack ()  
push a = State $ \xs -> ((),a:xs) 

虽然我理解它应该做什么,但它不会编译。我不知道为什么。错误信息是:
Stack.hs:6:7: Not in scope: data constructor `State'

Stack.hs:9:10: Not in scope: data constructor `State'

这对我来说毫无意义,因为据我所知,“状态”实际上是一个数据构造函数,定义为
newtype State s a = State { runState :: s -> (a,s) }

指南是否“错误”,如果是,我该如何解决?

最佳答案

正如我在评论中提到的,你应该使用 state而不是 State .

问题是 State不是独立的数据类型(或者更确切地说 newtype ),但它是 StateT变压器应用于Identity单子(monad)。实际上,它被定义为

type State s = StateT s Indentity

因为它只是 type同义词,不能有State构造函数。这就是为什么Control.Monad.State使用 state .

关于haskell - 状态单子(monad)和 learnyouahaskell.com,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9697980/

相关文章:

haskell - 了解 Kleisli 与 `bind`

jquery - 用 Monadic 咒语召唤 JQuery Deferred

scala - 在 monad 内部工作时如何编写尾递归函数

haskell - Haskell 中的列表推导是如何实现的?

haskell - 在路径上找不到名为 yesod 的可执行文件

haskell - 添加与进行Word8

sql - Esqueleto:如何使用联接删除项目

haskell - haskell 的出租车号码

syntax - Haskell:我可以在带有绑定(bind)运算符(>>=)的 block 之后使用 where 子句吗?

haskell - 并行 Repa 代码不会产生 Spark