【问题标题】:Keeping state around in Yesod在 Yesod 中保持状态
【发布时间】:2017-08-25 17:30:46
【问题描述】:

我正在尝试使用 Yesod 实现类似 Pachisi 的棋盘游戏。目前,Haskell 代码通过 Ajax 接收棋盘的当前状态,用它做一些事情(例如,计算一个新棋子是否可以进入棋盘,游戏是否结束等等)并将其返回为客户端可以使用的 JSON更新视图。

实际上,我在客户端中保持状态以规避 Haskell 没有可变性的问题。在其他语言中,我可能会声明一个变量 gameState 并在将其返回给客户端之前让服务器端代码对其进行修改,但在 Haskell 中......我可能完全遗漏了一些东西;当谈到 Haskell 时,我还没有经验。

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

【问题讨论】:

  • 是的,有更好的方法来做到这一点。例如,您可以将几乎所有客户端状态保留在数据库中,并根据客户端请求检索/更改它(获取只需要一个 ID,发布一个 ID + 变更集)。 persistent 是使用 Yesod 执行此操作的“默认”方式,但您可以推出自己的解决方案或根据需要使用其他解决方案。

标签: haskell state yesod


【解决方案1】:

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

您需要做的是使用代表您的状态的记录扩展此数据类型,例如MVar YourState

现在,在 Handler 操作中,您可以使用 y <- getYesod 获取 Foundation 值,从中提取一个 MVar 并随意使用/修改它。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多