J'ai travaillé sur la construction de mon propre simulateur Diplomacy dans Haskell pour me mouiller les pieds.Types/Types Confusion dans Haskell (peut-être) dans les types de données algébriques
Je crois que je suis venu avec une définition convenable pour quel ordre est:
data Order = Hold Unit Territory
| Move Unit Territory Territory
| Support Unit Territory Unit Territory Territory
| Convoy Fleet Territory Army Territory Territory
deriving (Eq, Show)
Pour ceux qui ne connaissent pas le jeu, les commandes sont écrites sous la forme de « Hold flotte London », "Move Fleet London Canal anglais", "Flotte de soutien flotte de la Manche de l'Atlantique Nord Atlantique Nord" ou "Convoi Flotte de la Manche de l'armée anglaise Londres Brest", etc
Maintenant, avec la définition de l'unité comme data Unit = Fleet | Army (deriving Eq, Show)
, I ' Je reçois l'erreur Not in scope: type constructor or class 'Fleet'
en ce qui concerne ma définition de l'ordre.
Pourquoi est-ce? Comment puis-je écrire mes définitions d'unités ou d'ordres (ou devrais-je faire quelque chose de différent) qui me permet d'exiger que le premier argument de Convoy soit une flotte et le troisième argument soit une armée? Est-ce que je ne suis pas "faux" avec mon approche de ce problème? Dois-je aborder cela dans ma fonction de validation (parce qu'il n'y a pas moyen de spécifier uniquement des commandes valides via Haskell, pour autant que je sache, c'est expressif mais pas si expressif)? J'ai déjà essayé d'utiliser "DataKinds", mais cela ne m'a pas aidé du tout (malgré le post-scriptum d'erreur suggérant de le faire, alors encore une fois, les postscript de l'erreur Haskell suggèrent beaucoup de choses, donc je doute que je doive payer trop y prêter attention).
Je suis un peu confus avec la terminologie. Vous montrez votre erreur lors de l'utilisation des types de données, mais demandez ensuite comment faire Fleet dans une classe de type? De toute façon, vous obtenez l'erreur car 'Fleet' n'est pas un type, c'est un constructeur du type' Unit'. Je pense que vous devriez repenser votre conception un peu. De plus, 'DataKinds' n'est certainement pas ce que vous voulez. Ils sont une fonctionnalité avancée qui ne s'applique pas ici. – pdexter
Oh, je ... j'ai un peu oublié que j'avais dit ça. Merci pour ça. Mise à jour maintenant fixé ceci. –