2017-08-25 5 views
0

J'essaye de mettre en application un jeu de société semblable à Pachisi avec Yesod. Actuellement, le code Haskell reçoit l'état actuel du tableau via Ajax, fait des choses avec lui (p.ex. calculer si une nouvelle pièce peut entrer dans le tableau, si le jeu se termine et ainsi de suite) et le retourne comme JSON que le client peut utiliser pour mettre à jour la vue.Garder l'état autour dans Yesod

En effet, je garde l'état dans le client pour contourner le problème que Haskell n'a aucune mutabilité. Dans d'autres langues, je déclarerais probablement une variable gameState et un code côté serveur la modifierait avant de la renvoyer au client, mais dans Haskell ... Il se peut que quelque chose me manque complètement; Je suis loin d'être expérimenté quand il s'agit de Haskell.

Je veux faire le moins possible du côté client car c'est censé être un exercice de haschelling. J'ai trouvé Haskell: Yesod and state mais je ne pouvais pas vraiment le comprendre. La question demeure donc: y a-t-il une meilleure façon de gérer l'état du jeu que ma solution?

+2

Oui, il existe de meilleurs moyens de le faire. Par exemple, vous pouvez conserver à peu près tout l'état du client dans une base de données et l'extraire/le modifier lors d'une requête client (obtenir uniquement un ID, poster un ID + changeset). ['persistent'] (https://www.yesodweb.com/book/persistent) est le moyen" par défaut "de le faire avec' Yesod', mais vous pouvez utiliser votre propre solution ou utiliser autre chose si vous le souhaitez. – Cubic

Répondre

4

C'est assez facile. La machine de Yesod tourne autour d'un type de données appelé Foundation. Dans l'échafaudage, ce type de données a le même nom, même.

Ce que vous devez faire est d'étendre ce type de données avec un enregistrement représentant votre état, par exemple MVar YourState.

Maintenant, dans Handler actions, vous pouvez utiliser y <- getYesod pour obtenir la valeur Foundation, en extraire un MVar et l'utiliser/modifier à votre gré.