gpt4 book ai didi

haskell - 如何在 Haskell 中修改 RWST 环境变量?

转载 作者:行者123 更新时间:2023-12-04 00:14:02 25 4
gpt4 key购买 nike

我正在尝试在名为“GLFW-b-Demo”的现有项目上构建我自己的项目。
它显然使用称为“RWST”的东西来模拟环境和状态:

data Env = Env
{ envEventsChan :: TQueue Event
, envWindow :: !GLFW.Window
, envGear1 :: !GL.DisplayList
, envGear2 :: !GL.DisplayList
, envGear3 :: !GL.DisplayList
, envPlane :: !GL.DisplayList
, envBlobs :: ![Blob]
, envZDistClosest :: !Double
, envZDistFarthest :: !Double
}

data State = State
{ stateWindowWidth :: !Int
, stateWindowHeight :: !Int
, stateXAngle :: !Double
, stateYAngle :: !Double
, stateZAngle :: !Double
, stateGearZAngle :: !Double
, stateZDist :: !Double
, stateMouseDown :: !Bool
, stateDragging :: !Bool
, stateDragStartX :: !Double
, stateDragStartY :: !Double
, stateDragStartXAngle :: !Double
, stateDragStartYAngle :: !Double
}

type Demo = RWST Env () State IO
从那个环境中检索一些东西很容易:
blobs <- asks envBlobs
但我还需要能够修改这些“变量”的值。
我是否需要将其移动到状态,以便能够更改它的值,或者我是否还可以修改事物的“env”部分的内容?

最佳答案

But I also need to be able to modify the value of those "variables". Would I need to move that to the state, to be able to change it's value or can I also modify the contents of the "env" part of things?


这取决于您是要在您控制下的计算中“本地”修改这些 env 值,还是要为之后可能出现的任何可能的计算修改它们。
在第一种情况下,您可以通过使用 local 获得:
local :: (r -> r) -> RWST r w s m a -> RWST r w s m a
RWST我们传递给 local 的计算退出,环境中的值 r将返回其原始版本,未经 r -> r 修改功能。
但是,如果您希望更改具有“粘性”,则需要将这些值移动到状态并使用诸如 put 之类的函数。或 modify .
一个例子:
import Control.Monad.IO.Class
import Control.Monad.Trans.RWS.Strict

action :: RWST Int () Char IO ()
action = do
local succ $ do -- affects only the nested action
v <- ask
liftIO $ print v
do
v <- ask
liftIO $ print v -- isn't affected by local
modify succ -- change seen by the following actions
do
s <- get
liftIO $ print s -- is affected by modify

main :: IO ()
main = do
(_, _, _) <- runRWST action 0 'a'
return ()
-- Results:
-- 1
-- 0
-- 'b'

关于haskell - 如何在 Haskell 中修改 RWST 环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65138699/

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