1

考虑下一个声明:

:- 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:第一个 arg 是类型变量

即使没有函数依赖,它也不允许使用类型变量声明实例。
我是否遗漏了什么或 Mercury 不允许不以地面实例结尾的实例?
有没有办法声明多态类型的实例,它是任何类型的包装器(没有约束)?也许存在一些特殊的类型类,比如all_types(T)

4

1 回答 1

3

简短的回答:

Mercury 不支持实例声明中的类型变量。(这是编译器抱怨的)。

长答案:

没有办法创建这样的类型类实例。由于类型类对 A 的所有值都有效,因此您可能根本不需要类型类。但看起来你正在尝试创建 Monads,目前这是不可能的,我们没有计划在不久的将来支持它

于 2011-02-07T02:00:55.323 回答