2

可変数の値と名前を持つことができるデータ型を Mercury で宣言したいと思います。例えば ​​:

type goal ---> pick; give; come.

3 つの変数/値があります。

私は次のようなものが欲しい:

type myplayer ---> de value declaration here.

これは、制限または固定されていない変数の数です。

したがって、 myplayer を使用して値/変数をv1, v2, v3 and v4.次のように宣言できますa, b, c, d, e, z, aa, ab and az

値の数は制限されず、名前も固定されていません。

私は水星の新人です。

4

3 に答える 3

2

他の人が言ったように、これはマーキュリーでは不可能です - これは意図的なものです。

v1 v2 v3... などを表現するタイプが必要な場合は、次のようになります。

:- type my_type
    ----> v(int).

:- func name(my_type) = string.

name(v(Num)) = formst("v%d", [i(Num)]).

型はすべての整数の v を表し、関数名はこの型の値を「整形」するために使用できます。

于 2011-12-17T00:39:51.530 に答える
1

私がこの質問を理解する限り。Prolog のような動作が必要です。すなわち、型付けされた述語なし。静的に型付けされたシステムでは、自分で処理することで常にそのような動作を実現できます。かなり前に、Turbo Prolog でそのような例を見ました (Turbo/Visual Prolog に関して ISO Prolog を実装しました)。

次のようなものを検討してください(正しいかどうかはわかりません):

:- type any_type ---> atom_value(string)
                 ;    number_value(int)
                 ;    struct_value(any_type, list(any_type)).

guess(atom_value("v1")).
guess(atom_value("a")).
guess(atom_value("aa")).
guess(number_value(42)).
guess(struct_value(atom_value("pair"), [number_value(3), number_value(4)])).
于 2013-01-02T07:41:01.127 に答える
1

あなたが直接求めていることは、単に実行することはできません。与えられた

:- type question
        --->    truth(string, bool)
        ;       blank(string, string)
        ;       multiple(string, string, list(string)).

追加の種類の質問は、このタイプが定義されている場所で拡張し、モジュールを再コンパイルすることによってのみ追加できます。以前の決定論的なコードのように、他の多くの変更も加えます。

answer(truth(_, yes)) = "true".
answer(truth(_, no)) = "false".
answer(blank(_, A)) = A.
answer(multiple(_, A, _)) = A.

新しい質問タイプを指定すると失敗します。「すべて正しい答えを選ぶ」タイプの質問の追加を反映するようにプログラムを更新できなかった場所をコンパイル時に通知されることは、質問タイプが存在する理由の良い部分です。[["Are foxes pretty?", "true"], ["Green foxes are ____", "adorable!", "fake", "evidence of animal cruelty"]]問題バンクの文字列のリストを言う代わりに。

あなたが求めることはできません。しかし、実際にやりたいこと、つまり「型の可変数」が役に立つと思っていた目的は、別の方法で実現できるはずです。あなたの質問からなぜこれをやりたかったのか分からないので、それがどのような方法なのかわかりません。おそらく、言語リファレンスで識別された共用体または型クラスを読むことで利益が得られるでしょう。

于 2011-12-16T21:51:12.883 に答える