J'ai ce type de données et deux fonctions factices p> 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. P> P>
5 Réponses :
"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"
Je pense que vous vouliez dire "constructeur de données" plutôt que "constructeur de type".
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) = ??
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 maintenant, vous pouvez modifier la correspondance dans et vous pouvez toujours correspondre à un motif correspondant à un type d'exécutif spécifique p> appliquer code> comme ceci p>
Il est peut-être même une bonne idée de réutiliser le type peut-être prédéfini code> dans cette situation.
Dans votre cas particulier, vous pouvez effectuer les éléments suivants:
apply :: Struct -> String apply Empty = "matched Empty" apply _ = "matched Exec1 or Exec2"
apply Empty = "matched empty" apply (Exec1 _) = notEmpty apply (Exec2 _) = notEmpty notEmpty = "matched Exec1 or Exec2"