2017-08-25 137 views
0

我正在尝试与Yesod一起实施Pachisi式桌面游戏。目前,Haskell代码通过Ajax接收板子的当前状态,做一些事情(例如计算一块新板块是否可以进入板子,游戏是否结束等等)并将其作为客户端可以使用的JSON返回更新视图。在Yesod中保持状态

实际上,我在客户端保持状态以规避Haskell没有可变性的问题。在其他语言中,我可能会声明变量gameState,并在服务器端代码将其返回给客户端之前对其进行修改,但在Haskell中...我可能完全缺少某些东西;在Haskell方面,我的经验很少。

我想尽可能少地做客户端,因为这应该是一个哈克练习。我找到了Haskell: Yesod and state,但无法真正理解它。所以问题依然存在:有没有比我的解决方案更好的处理游戏状态的方法?

+2

是的,有更好的方法来做到这一点。例如,您可以保留数据库中几乎所有的客户端状态,并根据客户端请求检索/更改它(获取只需要一个ID,发布ID +更改集)。 ['persistent'](https://www.yesodweb.com/book/persistent)是通过'Yesod'实现此功能的“默认”方式,但如果您愿意,您可以推出自己的解决方案或使用其他方法。 – Cubic

回答

4

这很简单。 Yesod的机器围绕称为Foundation的数据类型旋转。在脚手架中,这种数据类型甚至具有相同的名称。

你需要做的是扩展这个数据类型,例如用一个代表你的状态的记录MVar YourState

现在,在Handler动作中,您可以使用y <- getYesod来获取基础值,从中提取一个MVar并根据您的意愿使用/修改它。