haskell state monad的功能和论证

时间:2015-02-19 10:09:58

标签: haskell state-monad

如果一个函数及其参数(也是一个函数)都改变了状态,我对状态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

1 个答案:

答案 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