用这个方便的 do-notation 写的,这对我来说似乎很清楚。但我似乎无法让脱糖版本>>=
用于工作,这令人担忧。有人可以用扩展符号重写这些吗?
未嵌套
stack1 :: StateT Int Identity ( Int, Int )
stack1 = do
a <- get
put ( a + 1 )
b <- get
return ( a, b )
runstack1 :: ( Int, Int )
runstack1 = evalState stack1 11
嵌套
stack3 :: StateT Int ( StateT String ( StateT String Identity ) ) ( Int, String, String )
stack3 = do
modify (+10)
lift $ modify ( ++ " world" )
lift . lift $ modify ( ++ " word" )
a <- get
b <- lift get
c <- lift . lift $ get
return ( a, b, c )
runStack3 :: ( Int, String, String )
runStack3 = runIdentity $ evalStateT ( evalStateT ( evalStateT runStack3 1 ) "hello" ) "harro"
此外,通过比较 runStack1 和 runStack3 的签名,我可以看到为什么runIdentity
需要,但是有人可以解释为什么会这样的内部原因,因为 stack1 和 stack3 都包装了 Identity 构造函数?