我有這樣的說法:意義
newtype State st a = State (st -> (st, a))
。因此State
類型是:
State :: (st -> (st, a)) -> State st a
我不明白其中的含義:
- 是
st
和a
只是兩個數據類型的佔位符?對? - 該聲明是否意味着State是一個函數,它作爲一個函數的參數?
我有這樣的說法:意義
newtype State st a = State (st -> (st, a))
。因此State
類型是:
State :: (st -> (st, a)) -> State st a
我不明白其中的含義:
st
和a
只是兩個數據類型的佔位符?對?是的,是的。 st
是州的類型,而a
是答案類型。
是的。數據構造函數是Haskell中的函數,具有可以對它們進行模式匹配的附加功能。因此,例如,如果您有fs : [st -> (st, a)]
類型的列表,您可以執行map State fs :: [State st a]
。
狀態單子工作常規的方式是State st a
表示狀態變壓器:接受一個初始狀態,執行某些計算可取決於或改變該狀態的東西,併產生a
類型的結果。編寫兩個狀態變換器意味着創建一個複合類型,它執行第一個狀態的初始狀態,然後執行第二個狀態,並執行第一個狀態。
因此,State
monad實現模型直接作爲st -> (st, a)
類型的函數。編寫兩個這樣的函數只是生成一個複合函數,它將初始狀態提供給第一個函數,將由此產生的狀態傳遞給第二個函數,並返回第二個狀態和結果。代碼:
bindState :: State st a -> (a -> State st b) -> State st b
bindState (State function1) f =
State $ \initialState -> let (nextState, firstResult) = function1 initialState
in f firstResult