2016-09-11 1 views
1

Ich habe einen Containertyp, genannt X. Da ich heterogene Listen über X möchte, wird sein Konstruktor existentiell über eine Typvariable a geschrieben. Ich möchte jedoch, dass es eine Instanz der Eq Typklasse ist. Eine haschische Lösung sieht so aus:GADTs, nichtparametrisierte Typen und Instanz Eq für sie

{-# LANGUAGE GADTs #-} 

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

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

Was wäre die einfachste (saubere) Lösung für dieses Problem?

(X s nicht gleich, wenn sie die gleiche Art nicht haben.)

Antwort

7

Typeable hinzufügen, so dass Sie eine Laufzeitdarstellung des Typs haben; Verwenden Sie dann cast, um einen von ihnen in den entsprechenden Typ zu konvertieren.

{-# 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