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)
当你说
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)
等与该“初始” as在do块中。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |