了解State Monad中的State论点

Ber*_*ian 5 monads haskell state-monad

我正竭尽全力将状态环绕在Monad州周围,我不明白以下几点:

给定returnand 的实现(>>=),您说什么State $ \s ->....,它s从哪里来?我的意思是,当您开始演奏时>>= ... >>=,这并不意味着您必须在链的开始位置以某种方式提供该初始参数吗?

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

 instance Monad (State s) where
        return a=State $ \s->(a,s)
        (>>=) m g=State $ \s -> let (a,s')= runState m s in
                                   runState (g a) s'
Run Code Online (Sandbox Code Playgroud)

(>>=)你说的话State $ \s -> runState m s,我不知道什么时候调用那个初始的(\s -> ...) argument(带有REAL argument)?

有人可以解释一下吗?

以后编辑

有人可以告诉我如何initial设置状态,比方说是否需要使用来获取值getLine

main::IO()
main=do
  argument<-getLine
  --how do i set initial state with argument?
  m >> f1 >> f2 >> f3
Run Code Online (Sandbox Code Playgroud)

Wil*_*ess 5

当你说State $ \s ->....,它s从哪里来?

来自调用,当runState 初始状态值提供给国家单子值,运行合并计算它描述:

st = do { x <- get ; return (x+1) }

x = runState st 0    -- x is (1,0)
Run Code Online (Sandbox Code Playgroud)

我还感觉到您还有另一个可能的误解:您写道:“ 什么时候叫那个缩写(\s -> ...) argument?” 没有“初始” lambda:lambda全部嵌套在里面!

do { a <- as; b <- bs; c <- foo b; return c }
Run Code Online (Sandbox Code Playgroud)

转换为

as >>= (\a -> bs >>= (\b -> foo b >>= (\c -> return c)))
Run Code Online (Sandbox Code Playgroud)

因此,它不是“初始”的,而是结合了所有的以初始状态调用的lambda!

然后它将调用

let (a,s1) = runState as s0
Run Code Online (Sandbox Code Playgroud)

等与该“初始” asdo块中。