agr*_*eif 3 haskell state-monad
如果一个函数及其参数(也是一个函数)都改变了状态,我对状态monad的用法有疑问.
这里是简短信息:
函数foo更改状态
函数bar更改状态
我想打电话:
foo bar
Run Code Online (Sandbox Code Playgroud)
如果我bar单独打电话,状态设置为"bar"
如果我打电话foo bar然后状态只是"foo"而不是"foobar",所以似乎bar没有改变状态,我不明白为什么.
任何澄清表示赞赏.
这是完整的代码:
module Main where
import Control.Monad.State
main :: IO ()
main = do
a <- execStateT test1 ""
print a
a <- execStateT test2 ""
print a
type MyState = String
type MyStateMonadT = StateT MyState IO
test1 :: MyStateMonadT ()
test1 = do
bar
return ()
test2 :: MyStateMonadT ()
test2 = do
foo bar
return ()
data Foo = Foo
data Bar = Bar
foo :: MyStateMonadT Bar -> MyStateMonadT Foo
foo bar = do
modify (++"foo")
return Foo
bar :: MyStateMonadT Bar
bar = do
modify (++"bar")
return Bar
Run Code Online (Sandbox Code Playgroud)
问题是你实际上并 没有bar在里面打电话foo.
你可以使用_ <- bar.
这附加"foobar"到州:
foo :: MyStateMonadT Bar -> MyStateMonadT Foo
foo bar = do
modify (++"foo")
_ <- bar
return Foo
Run Code Online (Sandbox Code Playgroud)
这附加"barfoo":
foo :: MyStateMonadT Bar -> MyStateMonadT Foo
foo bar = do
_ <- bar
modify (++"foo")
return Foo
Run Code Online (Sandbox Code Playgroud)