gpt4 book ai didi

haskell - 实现状态monad时的数据构造函数错误?

转载 作者:行者123 更新时间:2023-12-02 06:14:26 25 4
gpt4 key购买 nike

我正在通过状态 monad here 并且我正在尝试实现:

import Control.Monad.Reader
import Control.Monad.Writer
import Control.Monad.State

type Stack = [Int]

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

但是我收到以下错误:
"Data constructor not in scope:
State :: ([t0] -> (t0, [t0])) -> State Stack Int
Perhaps you meant one of these:
‘StateT’ (imported from Control.Monad.State),
variable ‘state’ (imported from Control.Monad.State)"

我在这里错过了一些基本的东西吗?

最佳答案

不,你不是。本教程正在简化一些事情(或者它可能只是过时了 - 我没有回过头来知道这两者中的哪一个)已经过时了。 Control.Monad.State 定义了一个 monad 转换器 StateT 。它还导出一个更简单的类型同义词,相当于教程教你的内容

type State s a = StateT s Identity a

但是,这确实意味着构造函数不是 State ,而是 StateT (并且它具有通用签名)。值得庆幸的是,您现在不需要为此担心太多。
  • 为了构造 State ,您可以使用 state 函数并假装它具有签名 state :: (s -> (a,s)) -> State s a (实际上,它具有更通用的签名 - 您会在错误消息中遇到)。
  • 要解构 State ,只需使用 runState :: State s a -> s -> (a,s) 而不是模式匹配。


  • 从你给出的例子中:
    import Control.Monad.Reader
    import Control.Monad.Writer
    import Control.Monad.State

    type Stack = [Int]

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

    关于haskell - 实现状态monad时的数据构造函数错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42133257/

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