gpt4 book ai didi

函数和参数中的 haskell 状态 monad

转载 作者:行者123 更新时间:2023-12-02 10:43:41 25 4
gpt4 key购买 nike

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

最佳答案

问题是您实际上并没有打电话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

关于函数和参数中的 haskell 状态 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28603585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com