我對單子狀態下獲取和修改的定義感到困惑。Haskell Monad狀態:獲取並修改
得到: 「獲取的狀態的特定的成分,使用供給的投影函數」。
修改:將舊狀態映射到狀態monad內的新狀態。舊國家被拋棄。
這意味着我們可以使用修改直接爲狀態組件分配一個值,如here。
但somewhere別人說,我們可以提供給狀態的功能和使用修改,並得到結果。
這似乎兩個作品,但它不知道哪一個工作在哪裏!
我對單子狀態下獲取和修改的定義感到困惑。Haskell Monad狀態:獲取並修改
得到: 「獲取的狀態的特定的成分,使用供給的投影函數」。
修改:將舊狀態映射到狀態monad內的新狀態。舊國家被拋棄。
這意味着我們可以使用修改直接爲狀態組件分配一個值,如here。
但somewhere別人說,我們可以提供給狀態的功能和使用修改,並得到結果。
這似乎兩個作品,但它不知道哪一個工作在哪裏!
你從來沒有引用第二個引用,所以我會忽略它在這個答案。如果你澄清這個問題的一部分,那麼我會試着回答它。
你引用源一個說:
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
,新狀態是您的函數應用於舊狀態的結果。
感謝您的答案。我修改了這個問題。我是一個簡單的例子,它允許一系列函數修改一個全局狀態。原則上,就像下面的第三個示例一樣,該示例不會使用某些函數更改狀態:https://wiki.haskell.org/Simple_StateT_use – 4xx
我不明白什麼是你的困惑的根源。 'gets'接受狀態並應用用戶提供的投影功能。 '修改'用一個用戶提供的函數將舊狀態映射到新狀態來改變狀態。這裏有什麼問題?你應該編輯你的問題並使其更清楚。 – chi
如果您要引用外部來源,請實際引用它們。對於第二個來源,「應用」一詞甚至不會出現在頁面上。那頁面實際上說*會導致你的困惑? (而不是說明你從中理解了什麼會導致你的困惑)。 'modify'改變狀態,'gets'檢索它。如果你想改變狀態,你可以使用'modify'。如果你想檢索它,你可以使用'gets'。 – user2407038