10
votes

Constructeur motif correspondant haskell

J'ai ce type de données xxx

et deux fonctions factices xxx p> second fonctionne bien, mais le premier est en train de causer Erreur: "Erreur d'analyse dans le motif: EXEC". Pouvez-vous planter expliquer pourquoi je ne peux pas correspondre à constructeur de cette façon: Appliquer (EXEC STRUTT) = ...?

Causer beaucoup de code de la chaudron lorsque j'ai plusieurs constructeurs dans mon DataType et que le modèle doit correspondre tous séparément.


0 commentaires

5 Réponses :


3
votes

"EXEC" n'est pas un constructeur de type et vous ne pouvez les utiliser que dans la correspondance des motifs.

Ce que vous pouvez faire est P>

data Struct val =  Empty | Exec Int val

apply :: Struct -> String
apply (Empty) = "matched Empty"  
apply (Exec _ _) = "matched Exec1 or Exec2"              

apply' :: Struct val -> String
apply' (Empty)   = "matched Empty"  
apply' (Exec 1 _) = "matched Exec1"
apply' (Exec 2 _) = "matched Exec2"


1 commentaires

Je pense que vous vouliez dire "constructeur de données" plutôt que "constructeur de type".



3
votes

pourquoi? Parce que vous pouvez uniquement correspondre constructeurs, et exécuté code> est une sorte de nouvelle variable. Une des raisons pour cela est par exemple ce qui suit:

data Struct2 =  Empty | Exec1 String
                      | Exec2 Int

apply :: Struct2 -> String
apply Empty = "matched Empty"  
apply (exec struct) = ??


0 commentaires

22
votes

En général, si vous avez plusieurs constructeurs qui partagent des données, il est généralement préférable de refroidir la déclaration des données à quelque chose comme xxx

maintenant, vous pouvez modifier la correspondance dans appliquer comme ceci xxx

et vous pouvez toujours correspondre à un motif correspondant à un type d'exécutif spécifique xxx


1 commentaires

Il est peut-être même une bonne idée de réutiliser le type peut-être prédéfini dans cette situation.



2
votes

Dans votre cas particulier, vous pouvez effectuer les éléments suivants:

apply :: Struct -> String
apply Empty = "matched Empty"  
apply _     = "matched Exec1 or Exec2"


0 commentaires

0
votes
apply Empty = "matched empty"
apply (Exec1 _) = notEmpty
apply (Exec2 _) = notEmpty

notEmpty  = "matched Exec1 or Exec2"

0 commentaires