У меня есть вопрос относительно использования монады состояния, если функция и ее аргумент, который также является функцией, изменяют состояние.
вот краткая информация:
функция 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