2017-08-25 136 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並根據您的意願使用/修改它。