gpt4 book ai didi

haskell - State Monad 的实现

转载 作者:行者123 更新时间:2023-12-02 05:38:30 24 4
gpt4 key购买 nike

我正在研究一个简单的例子来在 Haskell 中实现状态 monad。我使用记录语法创建了一个数据类型 GlobState。函数 incr1、incr2 和 incr3 用于递增相应的记录元素。我写的代码是:

module StateExample where
import Control.Monad.State

data GlobState = GlobState { c1 :: Int, c2:: Int, c3:: Int} deriving (Show)

newGlobState:: GlobState
newGlobState = GlobState { c1=0,c2=0,c3=0 }

--incr1 :: State GlobState ()
incr1 = do
gets c1
modify (+1)

--incr2 :: State GlobState ()
incr2 = do
gets c2
modify(+1)

incr3 = do
gets c3
modify(+1)

main = do
let ((),a1) = flip runState newGlobState $ do
x<- incr1
y<- incr2 x
z<- incr1 y
return z
print a1

此程序未提供所需的输出。而且我不确定增量函数的签名或者 gets 是否正在做我打算做的事情。请帮忙。

我怎样才能更改代码,而不是定义不同的增量函数,我只需要创建一个增量函数。我打算这样做:

incr :: String-> State GlobState ()
incr x = do
modify(\g -> g {x =x g + 1})

最佳答案

至少你的类型是正确的。

incr1 :: State GlobState ()
incr1 = modify (\state -> state {c1 = 1 + c1 state})

如果您在 State Int () 中工作,您的 modify (+1) 会很好,但我们不是。您似乎认为 gets 将以下行集中到状态的特定字段上 --- 但事实并非如此。

incr2incr3 需要进行类似的更改。

关于main:

  1. 您需要正确缩进代码。您似乎希望 print a1 成为外部 do block 的一部分,而不是内部 do block 的一部分。没有缩进,编译器无法解决这个问题。
  2. 您正在(尝试)手动对状态进行线程处理,但关于 State 的全部要点在于它的单子(monad)/应用程序管道会为您完成。
main = do let ((), a1) = flip runState newGlobState $ do incr1
incr2
incr1
print a1

关于haskell - State Monad 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9076881/

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