полиморфные экземпляры для классов типов в языке Mercury - PullRequest
1 голос
/ 10 августа 2010

Рассмотрим следующую декларацию:

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

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

Меркурий (10.04) производит:

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

Даже без функциональной зависимости это не позволит объявить экземпляр с переменными типа.
Я что-то упустил, или Меркурий не допускает экземпляры, которые не заканчиваются наземным экземпляром? Есть ли способ объявить экземпляр для полиморфного типа, который является оберткой для любого типа (без ограничений)? Может быть, существует какой-то особый класс типов, например all_types(T)?

1 Ответ

3 голосов
/ 07 февраля 2011

Краткий ответ:

Mercury не поддерживает переменные типа в объявлениях экземпляров. (на что жалуется компилятор).

Длинный ответ:

Нет способа создать такой экземпляр класса типов. Так как класс типов будет действителен для всех значений A, возможно, вам вообще не нужен класс типов. Но похоже, что вы пытаетесь создать монады, в настоящее время это невозможно, и мы не планируем поддерживать это в ближайшем будущем

...