意義

2012-06-05 92 views
0

我有這樣的說法:意義

newtype State st a = State (st -> (st, a)) 

。因此State類型是:

State :: (st -> (st, a)) -> State st a 

我不明白其中的含義:

  • sta只是兩個數據類型的佔位符?對?
  • 該聲明是否意味着State是一個函數,它作爲一個函數的參數?

回答

1

是的,是的。 st是州的類型,而a是答案類型。

2

是的。數據構造函數是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