haskell state monad的功能和论证

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)

Dog*_*ert 8

问题是你实际上 没有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)