Рассмотрим следующую декларацию:
:- 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)
?