Полиморфные экземпляры для классов типов в языке Mercury

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

:- 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: В объявлении экземпляра для `monad.infer_wrap(A, monad.wrap(A))':
monad.m:011: первый аргумент является переменной типа

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

1 ответ

Решение

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

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

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

Нет никакого способа создать такой экземпляр класса типов. Поскольку класс типов будет действителен для всех значений A, возможно, вам вообще не нужен класс типов. But it looks like you're trying to create Monads, currently this is impossible and we have no plans to support it in the immediate future

Другие вопросы по тегам