簡體   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