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