创建`State [Int] Int`

时间:2014-08-18 02:58:58

标签: haskell state-monad

通过Learn You a Haskell阅读,我试图构建Stack [Int] Int

ghci>import Control.Monad.State

ghci> let stack = state ([1,2,3]) (1) :: State [Int] Int

<interactive>:58:20:
    Couldn't match expected type `s0 -> (State [Int] Int, s0)'
                with actual type `[t0]'
    In the first argument of `state', namely `([1, 2, 3])'
    In the expression: state ([1, 2, 3]) (1) :: State [Int] Int
    In an equation for `stack':
        stack = state ([1, 2, 3]) (1) :: State [Int] Int

如何创建Stack [Int] Int

1 个答案:

答案 0 :(得分:6)

这取决于你想要做什么。 State s a对于某种函数类型(具体为newtype)本质上是s -> (a, s),因此从列表中创建State值实际上没有意义。 State的简化(内部)定义类似于

newtype State s a = State { runState :: s -> (a, s) }

虽然您不会直接使用State构造函数,但它确实说明了State s a值由函数组成的事实。

您需要一个以某种方式更新状态的功能(可以被视为“State操作”),然后您可以使用runState :: State s a -> s -> (a, s)执行提供的State操作,给定某个初始状态(s参数)。

看起来您希望使用[1, 2, 3]作为初始状态,但您还需要提供该更新功能(您可以使用它来构造State s a值本身)。

在Learn You a Haskell示例中,Stack类型同义词表示实际堆栈数据,而State Stack ...表示 Stack数据上的有状态操作。例如,State Stack Int类型的操作使用Stack值作为其状态,并在执行时生成Int