在 Yesod 保持状态
Keeping state around in Yesod
我正在尝试使用 Yesod 实现类似 Pachisi 的棋盘游戏。目前,Haskell 代码通过 Ajax 接收棋盘的当前状态,用它做一些事情(例如计算新棋子是否可以进入棋盘,游戏是否结束等等)和 returns 它作为 JSON 客户端可以用来更新视图。
实际上,我在客户端中保持状态以规避 Haskell 没有可变性的问题。在其他语言中,我可能会声明一个变量 gameState
并让服务器端代码在将其返回给客户端之前对其进行修改,但是在 Haskell 中……我可能会完全遗漏一些东西;在 Haskell 方面,我远没有经验。
我想尽可能少地做客户端,因为这应该是 haskelling 的练习。我找到了 Haskell: Yesod and state 但无法真正理解它。所以问题仍然存在:有没有比我的解决方案更好的处理游戏状态的方法?
这很简单。 Yesod 的机器围绕一种名为 Foundation
的数据类型旋转。在脚手架中,此数据类型具有相同的名称,甚至。
您需要做的是用代表您所在州的记录扩展此数据类型,例如 MVar YourState
。
现在,在 Handler
操作中,您可以使用 y <- getYesod
获取 Foundation 值,从中提取一个 MVar 并根据需要 use/modify 它。
我正在尝试使用 Yesod 实现类似 Pachisi 的棋盘游戏。目前,Haskell 代码通过 Ajax 接收棋盘的当前状态,用它做一些事情(例如计算新棋子是否可以进入棋盘,游戏是否结束等等)和 returns 它作为 JSON 客户端可以用来更新视图。
实际上,我在客户端中保持状态以规避 Haskell 没有可变性的问题。在其他语言中,我可能会声明一个变量 gameState
并让服务器端代码在将其返回给客户端之前对其进行修改,但是在 Haskell 中……我可能会完全遗漏一些东西;在 Haskell 方面,我远没有经验。
我想尽可能少地做客户端,因为这应该是 haskelling 的练习。我找到了 Haskell: Yesod and state 但无法真正理解它。所以问题仍然存在:有没有比我的解决方案更好的处理游戏状态的方法?
这很简单。 Yesod 的机器围绕一种名为 Foundation
的数据类型旋转。在脚手架中,此数据类型具有相同的名称,甚至。
您需要做的是用代表您所在州的记录扩展此数据类型,例如 MVar YourState
。
现在,在 Handler
操作中,您可以使用 y <- getYesod
获取 Foundation 值,从中提取一个 MVar 并根据需要 use/modify 它。