【发布时间】:2019-05-20 13:17:15
【问题描述】:
我非常努力地围绕着 State Monad,但我不明白以下内容:
鉴于return和(>>=)的实现,当你说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'
在(>>=) 你说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
【问题讨论】:
-
它是 initial 状态,因此可以创建函数,其中状态被传递(有时被修改)并传递到下一个状态。
-
因此我们采用两种状态,并创建一个新的
State。State实际上不是状态,而是状态的change。因此,我们创建了一个新的状态更改,首先将s传递给第一个,结果(a, s')包含修改后的状态s',然后传递给下一个。 -
将
State s a值视为“状态转换器”,这是一台可以修改状态的机器,当输入一个值时,它会在此过程中生成a类型的值。当一个人最终决定使用runState myStateValue myInitialState运行一元计算时,就会传递具体的、真实的初始状态。这是使用 monad 的典型工作流程:您使用大量>>=/return来构建M a类型的值,并在最后一步使用runM将M a转换为一些可用类型,打破一元抽象。 -
您在 IO do 块中写入
let x = runState st argument,或runState (do { x <- get ; return (x+1) }) 0。但这是一个新问题。
标签: haskell monads state-monad