2016-09-11 6 views
1

J'ai un type de conteneur, appelé X. Comme je veux des listes hétérogènes sur X, son constructeur est typé existentiellement sur une variable de type a. Cependant, je veux que ce soit une instance de la classe de type Eq. Une solution hackish ressemble à ceci:GADT, types non paramétrés et instance Eq pour eux

{-# LANGUAGE GADTs #-} 

data X where X :: (Eq a, Show a) => a -> X 

instance Eq X where 
    X x == X y = show x == show y 

Quelle serait la solution (propre) la plus simple pour ce problème?

(X s ne sont pas égaux si elles ne sont pas du même type.)

Répondre

7

Ajouter Typeable afin que vous ayez une représentation d'exécution du type; puis utilisez cast pour en lancer un au type approprié.

{-# LANGUAGE GADTs #-} 
import Data.Typeable 

data X where X :: (Eq a, Typeable a) => a -> X 

instance Eq X where 
    X x == X y = Just x == cast y