J'ai construit un type Sup
qui incorpore une valeur d'un autre type t
en utilisant le sous-typage constructeur.Force GHC à ignorer la contrainte de type manquant
data Sup t = ...
| Sub t
deriving Eq
Parce que la partie omise de Sup
contient beaucoup de constructeurs, dont aucun n'utilisent t
, je veux Eq (Sup t)
tirent plutôt que de donner un exemple manuel.
Une contrainte de type Eq t
est maintenant en place sur l'instance de (==)
pour Sup t
:
(==) :: Eq t => Sup t -> Sup t -> Bool
Le prédicat isSub :: Sup t -> Bool
est défini comme suit:
isSub :: Sup t -> Bool
isSub (Sub _) = True
isSub _ = False
Avec l'aide de ce prédicat Je souhaite définir l'opérateur suivant:
supEq :: Sup t -> Sup t -> Bool
supEq x y = not (isSub x) && not (isSub y) && x == y
La définition ci-dessus n'est pas acceptée par GHC, car la contrainte de type Eq t
est manquante. Cependant, grâce à l'évaluation paresseuse, je sais que l'égalité entre les valeurs de type t
n'est jamais réellement utilisée.
Existe-t-il un moyen de forcer GHC à ignorer la contrainte de type manquante? Sinon, est-il possible d'avoir défini Sup
ou supEq
pour obtenir le résultat souhaité: une définition de supEq
sans avoir à propager une contrainte de type redondant où supEq
est utilisé et sans avoir à donner une instance manuelle pour Eq (Sup t)
.
Quel cas d'utilisation avez-vous pour cette construction? – bheklilr
Donc vous voulez que 'supEq' juge deux valeurs de la forme' Sup a' toujours aussi inégales, même 'supEq (Sub 1) (Sub 1) ≡ False'? Peut-être utile d'indiquer clairement ceci dans la question. – leftaroundabout
Je pense que vous pouvez utiliser Data.Data.toConstr (voir https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Data.html) pour obtenir une représentation du constructeur utilisé et construire De là. Voir aussi [ma réponse précédente à une question similaire-ish] (http://stackoverflow.com/questions/2628104/pattern-matching-of-algebraic-type-data-constructors)/2630312 # 2630312 – yatima2975