我使用State Monad维护我的世界,并使用Gloss for graphics。光泽传递了一个"世界"每个" tick"之间的对象继续前进。问题是,为此我需要能够定义:
wsToPicture :: WorldState () -> Picture
,其中
World = data World = World { ... }
WorldState = type WorldState = State World
Picture = Gloss's representation of a graphic.
我能得到的最好的是:
wsToPicture :: WorldState () -> Picture
wsToPicture ws = toPicture . execState ws startingWorld
,其中
startingWorld = The very initial state of the world
toPicture = World -> Picture (Defined elsewhere)
至少编译,但世界重置每个滴答。把startingWorld
放在那里纯粹是为了编译;我知道这是错的。如果我没有当前的State
给出它,我如何退出World
monad?唯一可用的世界位于WorldState
内,我无法使用get
来提取它,因为只要我使用>>=
,该函数就必须返回{{ 1}}。
我假设我误解了某些东西。有人可以对这可能是什么有所了解吗?
答案 0 :(得分:3)
这似乎是xy problem。 Gloss为您提供了一个状态,它是您的更新和事件处理功能的全球:
update :: TimeDiff -> World -> World
handle :: Event -> World -> World
-- ||||| ^^^^^ next world
-- ^^^^^ current world
您可能使用State
来简单修改您的世界。这完全可能 update
或handle
:
update :: TimeDiff -> World -> World
update dt world = flip execstate world $ do
-- do something with world, e.g.
modify (\w -> w {players = round (exp dt) })
但您的World
本身不应基于State
或StateT
。