2013-01-24 2 views
6

Est-il possible de mettre en œuvre une classe de type comme suit:Puis-je différencier les instances de classe de type lors de l'exécution?

class SomeClass e where 
    isEq :: (SomeClass e') => e -> e' -> Bool 

isEq x y reviendriez vrai quand x et y sont tous les deux la même instance de cette classe de type?

Contexte: Il s'agit d'une tentative à peine voilée d'obtenir des tests de type à l'exécution. Au début, j'ai lu que Haskell a un effacement de type, j'ai aussi lu cela avec des extensions récentes de GHC, des informations sur l'exécution.

edit: pour ceux qui s'interrogent sur mon utilisation ... J'ai utilisé la programmation au niveau du type pour assurer certaines propriétés de certains de mes ADT, à savoir l'utilisation des ressources. Ces ressources sont représentées par des types distincts (et les verrous de ressources sont implémentés en conséquence au niveau du type).

Je tente d'écrire une procédure d'optimisation qui nécessite l'identification de l'écriture/lecture des ressources. Mais puisque toutes mes ressources sont représentées par des singletons distincts, dont le seul facteur commun (à l'exception de toutes les valeurs qui sont en bas) est le type de classe qui les regroupe.

En un mot, je veux utiliser les résultats de ma programmation de niveau type à un niveau de valeur d'exécution.

+9

Connaissez-vous [Data.Typeable] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Typeable.html)? Cela semble pertinent ... –

+1

La question est trompeuse. Vous semblez vouloir, et les réponses fournir, un moyen de différencier les types lors de l'exécution. Je m'intéresse à l'autre question: peut-on énumérer les classes habitées par un type particulier à l'exécution. –

+0

@ ThomasM.DuBuisson Il n'y a pas de quantification sur les typeclasses (c'est-à-dire qu'il n'y a pas de variables de type typeclass dans haskell), donc c'est peu probable. – permeakra

Répondre

15

Vous pouvez faire cela, comme le suggère le Karolis Juodelė, avec Data.Typeable:

Prelude Data.Typeable> :{ 
Prelude Data.Typeable| let isEq :: (Typeable a , Typeable b) => a -> b -> Bool 
Prelude Data.Typeable|  isEq x y = typeOf x == typeOf y 
Prelude Data.Typeable| :} 
Prelude Data.Typeable> isEq True() 
False 
Prelude Data.Typeable> isEq True False 
True 

La question est: Pourquoi savez-vous pas à l'exécution de ce que les types sont, et pourquoi voulez-vous au sujet s'ils sont égaux - pouvez-vous élaborer votre cas d'utilisation?

+11

whoa! Je ne connaissais pas la ': {:}' syntaxe de ghci, c'est génial: D – sinan

+1

"Pourquoi ne sauriez-vous pas au moment de l'exécution quels sont les types, et pourquoi vous soucieriez-vous de savoir s'ils sont égaux?" - Très bonne question. +1 – AndrewC

Questions connexes