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:最初の引数は型変数です

関数従属性がなくても、型変数を使用してインスタンスを宣言することはできません。
私は何かが足りないのですか、それともMercuryはグラウンドインスタンスで終わらないインスタンスを許可していませんか?
(制約なしで)任意の型のラッパーであるポリモーフィック型のインスタンスを宣言する方法はありますか?たぶん、?のような特別な型クラスが存在しますall_types(T)か?

4

1 に答える 1

3

短い答え:

Mercuryは、インスタンス宣言で型変数をサポートしていません。(これはコンパイラが不平を言っていることです)。

長い答え:

そのような型クラスインスタンスを作成する方法はありません。タイプクラスはAのすべての値に対して有効であるため、タイプクラスはまったく必要ないかもしれません。しかし、あなたはモナドを作成しようとしているようです。現在、これは不可能であり、近い将来にサポートする予定はありません。

于 2011-02-07T02:00:55.323 に答える