Donc, je crée un type de donnéesMotif assorti pour les instances alternatives de l'équation
data Expr a = Const a
| Expr a :*: Expr a
Et je définir une instance pour Eq
pour ce type de données
instance (Eq m) => Eq (Expr m) where
Const a == Const b = a == b
(a :*: b) == (c :*: d) = ((a == c) && (b == d)) || ((a == d) && (b == c))
Cette définition signifie que l'ordre n'a pas d'importance en comparant deux expressions. Cependant, lorsque j'utilise la correspondance de modèles pour écrire une fonction qui prend Expr
s Je ne peux pas écrire
f (Const 1 :*: a) = ...
, mais il faut aussi écrire
f (a :*: Const 1) = ...
pour attraper tous les cas, même si si j'où comparer les deux en utilisant (==)
il reviendrait vrai.
Existe-t-il un moyen d'écrire juste l'une des expressions ci-dessus et de laisser l'instance de Eq
s'occuper du reste? Est-ce que la correspondance de modèle utilise ou requiert une instance de Eq
?