2017-07-16 92 views
-2

我對單子狀態下獲取和修改的定義感到困惑。Haskell Monad狀態:獲取並修改


Somewhere說:

得到: 「獲取的狀態的特定的成分,使用供給的投影函數」。

修改:將舊狀態映射到狀態monad內的新狀態。舊國家被拋棄。

這意味着我們可以使用修改直接爲狀態組件分配一個值,如here


somewhere別人說,我們可以提供給狀態的功能和使用修改,並得到結果。


這似乎兩個作品,但它不知道哪一個工作在哪裏!

+2

我不明白什麼是你的困惑的根源。 'gets'接受狀態並應用用戶提供的投影功能。 '修改'用一個用戶提供的函數將舊狀態映射到新狀態來改變狀態。這裏有什麼問題?你應該編輯你的問題並使其更清楚。 – chi

+0

如果您要引用外部來源,請實際引用它們。對於第二個來源,「應用」一詞甚至不會出現在頁面上。那頁面實際上說*會導致你的困惑? (而不是說明你從中理解了什麼會導致你的困惑)。 'modify'改變狀態,'gets'檢索它。如果你想改變狀態,你可以使用'modify'。如果你想檢索它,你可以使用'gets'。 – user2407038

回答

1

你從來沒有引用第二個引用,所以我會忽略它在這個答案。如果你澄清這個問題的一部分,那麼我會試着回答它。

你引用源一個說:

gets :: MonadState s m => (s -> a) -> m a Source # 
Gets specific component of the state, using a projection function supplied. 

modify :: MonadState s m => (s -> s) -> m() Source # 
Monadic state transformer. 
Maps an old state to a new state inside a state monad. 

所以對於gets你可以提供一個功能s -> a並應用該功能,以目前的狀態後,將返回a。對於modify,您提供了一個函數s -> s,新狀態是您的函數應用於舊狀態的結果。

+0

感謝您的答案。我修改了這個問題。我是一個簡單的例子,它允許一系列函數修改一個全局狀態。原則上,就像下面的第三個示例一樣,該示例不會使用某些函數更改狀態:https://wiki.haskell.org/Simple_StateT_use – 4xx