2010-07-13 53 views
4

我正在閱讀Monad教程,現在正在處理的是http://www.muitovar.com/monad/moncow.xhtml,但是我遇到了Monad狀態問題,或者更準確地說runState訪問器函數。瞭解Haskell訪問器函數

該類型定義爲

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

和它的例如所謂的

runState (chncasewst3 'e' 'd' 'f') False 

我不知道如何讀取到第二行的定義,尤其是因爲「國家的一部分」。如果它在「狀態」的位置,我可以推斷出訪問者已經被「咖」了。

所以,問題是;如何讀取類型定義,以便我可以看到如何在這種情況下調用訪問器函數,並且如果可能的話,如何讀取訪問器函數本身。

回答

12

當你定義的數據類型作爲

data T a b = MkT { getA :: a, getB :: b } 

看它像

data T a b = MkT a b 

與自動定義的兩個輔助功能:

getA :: (T a b) -> a 
getA (MkT x _) = x 

getB :: (T a b) -> b 
getB (MkT _ y) = y 

當您申請getA的值的T,結果是a類型的。

現在你State類型僅由一個元件,其類型是一個函數(:: s -> (a, s))的。 runStateState s a類型的值轉換爲這種類型的函數。

ghci> :t runState 
runState :: State s a -> s -> (a, s) 

應用runStateState s a類型的值每一次,結果是s -> (a,s)類型的函數。此函數的第一個參數是狀態變量的初始值(類型爲s)。

在教程示例,

  • chncasewst3 'e' 'd' 'f'具有類型State Bool String
  • 所以,runState (chncasewst3 'e' 'd' 'f')具有類型Bool -> (String, Bool)
  • 所以,runState (chncasewst3 'e' 'd' 'f') False具有類型(String, Bool)

進一步閱讀: