无法逃脱国家Monad

时间:2014-11-20 17:31:26

标签: haskell

我使用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}}。

我假设我误解了某些东西。有人可以对这可能是什么有所了解吗?

1 个答案:

答案 0 :(得分:3)

这似乎是xy problem。 Gloss为您提供了一个状态,它是您的更新和事件处理功能的全球:

update :: TimeDiff -> World -> World
handle :: Event    -> World -> World
--                    |||||    ^^^^^ next world
--                    ^^^^^ current world

您可能使用State来简单修改您的世界。这完全可能 updatehandle

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本身不应基于StateStateT