如果一个函数及其参数(也是一个函数)都改变了状态,我对状态monad的用法有疑问。
这是简短的信息:
函数foo
更改状态
函数bar
更改状态
我想打电话:
foo bar
如果我单独拨打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
答案 0 :(得分:8)
问题是你实际上并没有在bar
内调用 foo
。
您可以使用_ <- bar
。
这会将"foobar"
追加到州:
foo :: MyStateMonadT Bar -> MyStateMonadT Foo
foo bar = do
modify (++"foo")
_ <- bar
return Foo
,这会追加"barfoo"
:
foo :: MyStateMonadT Bar -> MyStateMonadT Foo
foo bar = do
_ <- bar
modify (++"foo")
return Foo