haskell 在函数和参数中声明 monad

haskell state monad in function and argument

我对状态 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

问题是您实际上并不是在 foo.

调用 bar

您可以使用 _ <- 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