2010-08-10 19 views
1

Mercure considérer la prochaine déclaration:instances polymorphes pour classes de types en langue

:- type wrap(T) ---> wrap(T). 
:- inst wrap(I) ---> wrap(I). 

:- typeclass infer_wrap(A, B) <= ((A -> B)). 
:- instance infer_wrap(A, wrap(A)). 

Mercury (10.04) produit:

monad.m:011: In instance declaration for `monad.infer_wrap(A, monad.wrap(A))': 
monad.m:011: the first arg is a type variable

Même sans dépendance fonctionnelle, il ne permet pas de déclarer par exemple avec des variables de type.
Ai-je raté quelque chose ou Mercure n'autorise pas les instances qui ne se terminent pas par une instance au sol?
Existe-t-il un moyen de déclarer une instance pour un type polymorphe qui est un wrapper pour n'importe quel type (sans contraintes)? Peut-être existe-t-il une classe de type spécial comme all_types(T)?

Répondre

3

Réponse courte:

Mercury ne supporte pas les variables de type dans les déclarations d'instance. (qui est ce que le compilateur se plaint).

Réponse longue:

Il n'y a aucun moyen de créer une telle instance classe de types. Puisque la classe de type sera valide pour toutes les valeurs de A, vous n'avez peut-être pas besoin d'une classe de types. Mais on dirait que vous essayez de créer des Monades, actuellement c'est impossible et nous n'avons aucun plan pour le soutenir dans un avenir immédiat