繁体   English   中英

创建`State [Int] Int`

[英]Creating a `State [Int] Int`

通过阅读《 学习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

这取决于您要执行的操作。 State sa本质上是一个newtype为某一种功能型的(特别是s -> (a, s)所以它并没有真正意义做一个State只从一个列表值。 的简化(内部)定义State看起来像

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

尽管您不会直接使用State构造函数,但它确实说明了State sa值包含一个函数这一事实。

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

看起来您想使用[1, 2, 3]作为初始状态,但是您也确实需要提供该更新功能(用于构造State sa值本身的功能)。

在“学习Haskell”示例中, Stack类型同义词表示实际堆栈数据,而State Stack ...表示 Stack数据的有状态操作。 例如,类型为State Stack IntStack值用作其状态,并在执行时产生一个Int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM