2010-12-01 19 views
1

Salutations, je suis nouveau à Haskell et je me suis retrouvé coincé dans la définition d'un type de données pour une affectation.Définition d'un type de données dans Haskell

J'ai besoin de créer le type "Stratégie", il s'agit essentiellement d'une chaîne de 1 à 6 caractères représentant chacune une valeur numérique, et je dois représenter des valeurs supérieures à 9 sous forme de lettre (jusqu'à 35 valeurs différentes). J'ai essayé de définir un type auxiliaire représentant chaque valeur possible et de l'utiliser pour créer mon type, mais mon code ne fonctionne pas et j'ai manqué d'idées. Telle est la définition que j'ai essayé:

data Value = '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | 'A' | 'B' | 
'C' | 'D' | 'E' | 'F' | 'G' | 'I' |'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 
'Q' |'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'Y' | 'X' | 'Z' 

data Strategy = Value | Value:Value | Value:Value:Value | 
Value:Value:Value:Value | Value:Value:Value:Value:Value |    
Value:Value:Value:Value:Value:Value 

Le type de valeur n'accepte pas les chiffres, et le type de stratégie « sorte de » fonctionne jusqu'au deuxième constructeur après quoi il fait faillite. Merci de votre aide!

+0

C'est parce que vous avez manqué quelque chose de fondamental types de données. Même si vous aurez bientôt une réponse avec le code correct, vous devez le comprendre! Les types de données ne sont pas des énumérations de valeurs possibles (eh bien, elles peuvent l'être et elles le sont d'un point de vue plus abstrait, mais cela ne fonctionne certainement pas comme ça). – delnan

+0

merci pour votre imput, j'ai besoin de le comprendre, et en fait j'ai eu l'impression que je pouvais utiliser un type de données pour créer un type énuméré comme je le ferais en java (tant qu'aucun des constructeurs n'avait de paramètres.Je voulais aussi pouvoir utiliser "dérivant (Eq, Ord, Enum)" pour pouvoir opérer sur les valeurs, puisque j'ai plusieurs fonctions à définir qui opèrent sur le type Stratégie. – user526861

+0

Le type de données peut (et est en fait) utilisé pour les énumérations - certains constructeurs sans paramètres, comme vous l'avez dit. Exemple réel du fichier stdlib: 'data IOMode = ReadMode | WriteMode | AppendMode | ReadWriteMode'. On dirait que vous connaissez un peu les types de données? – delnan

Répondre

6

Tout comme votre question précédente (supprimée), cela ressemble beaucoup à des devoirs. Cela aide aussi si vous choisissez un vrai nom et n'utilisez pas ce compte jetable.

This page vous explique comment utiliser les déclarations de type data de haskell. Que faites-vous différent/faux?

  1. vous utilisez des caractères au lieu des constructeurs pour Value. Le '1''2', etc sont tous les personnages, vous avez besoin d'un constructeur avec un ou plusieurs champs comme ValueCon1 Char et ValueCon2 String

  2. Vous utilisez les constructeurs de la liste et ce que je suppose est un champ de Value au lieu de définir de nouveaux constructeurs pour Strategy . Peut-être que vous voulez data Strategy = Strat [Value], qui acceptera une liste de n'importe quelle taille. Bien que plus pénible, vous pouvez définir beaucoup de constructeurs de stratégie avec un nombre fini de champs distincts.

BTW - où est enseigné votre cours? Il semble tard dans le terme à couvrir ces bases.

+0

Merci pour votre réponse, et en fait je viens de m'inscrire sur SO, ce n'est pas un compte jetable et je n'ai supprimé aucune question. Je vais essayer votre suggestion de définir de nombreux constructeurs de stratégies que je veux un maximum de 6 caractères possibles. Cela fait partie d'un projet de cours basé sur Haskell, mais je suis plus confiant quand il s'agit de gérer des fonctions et j'ai eu des problèmes avec les types de données, je ne peux pas aller très loin sans avoir les bons types! – user526861

+0

@user: Avec plusieurs constructeurs, "cons'ing" ('const' =': ') ne fonctionnera toujours pas. Dans la déclaration, vous spécifiez typed - mais 'cons' est un constructeur (quoique très important avec une syntaxe spéciale), pas un type. Le type est une liste, dont la taille est illimitée. Si vous voulez restreindre l'arité, utilisez les tuples ('(Value, Value)' est deux 'Value's et rien d'autre - les fonctions list ne fonctionneront pas dessus, ce qui peut les rendre peu maniables). – delnan

+0

A propos de la première partie de votre réponse, j'essayais de suivre l'exemple de la définition d'un type de semaine, comme "day = Monday | Tuesday | etc" que j'ai vu utilisé comme exemple de types énumérés, donc j'essayais pour faire quelque chose de similaire mais où chaque constructeur serait un personnage, alors j'ai essayé de supprimer les 'marques et l'interprète ne me laisserait pas utiliser les valeurs numériques comme éléments du type ... – user526861

1

type Strategy = [Char]

^^ comment je fait le faire.

Ou, peut-être

newtype Strategy = Strategy [Char]

C'est moins fondée sur des principes, comme l'obligation de vous de ne pas le remplir avec un non-sens. En utilisant la solution newtype, vous pouvez utiliser des "constructeurs intelligents" et dire, par ex.

mkStrategy :: [Char] -> Strategy 
mkStrategy x 
    | {- list is valid -} = Strategy x 
    | otherwise = error "you gave me a bad strategy!" 

dans votre code, vous ne voulez pas jeter l'erreur, mais retourner un type d'option, mais c'est une autre histoire ...

+0

C'est en fait ce que j'ai fini par faire et ça a rendu mon problème beaucoup plus simple, bien que je ne sois pas sûr de traiter des valeurs "non désirées". Merci pour votre réponse! – user526861