Неограниченная декларация имени переменной в ртути

Я хотел бы объявить тип данных в Mercury, который может иметь переменное число значений и имен. Например:

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

имеет три переменные / значения.

Я хочу что-то вроде:

type myplayer ---> de value declaration here.

что количество переменных не ограничено и не фиксировано.

Так что я могу использовать myplayer для объявления значений / переменных, таких как v1, v2, v3 and v4. Во второй раз я могу использовать его, чтобы delcare что-то вроде: a, b, c, d, e, z, aa, ab and az,

Количество значений не ограничено, а имена также не являются фиксированными.

Я новичок в Меркурии, поэтому мне нужна помощь.

Спасибо

3 ответа

Как уже говорили другие, это просто невозможно в Меркурии - что является преднамеренным.

Хотя вы можете захотеть, если вам нужен тип, который выражает: v1 v2 v3... и т. Д.

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

:- func name(my_type) = string.

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

Тип выражает v всех целых чисел, а имя функции можно использовать для "симпатичного вывода" значений этого типа.

То, что вы прямо просите, просто не может быть сделано. Дано

:- 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"]] для вашего банка вопросов.

То, что вы просите, не может быть сделано. Однако то, что вы на самом деле хотите сделать - конец, для которого вы думали, что "переменное число типов" было бы полезным средством, - безусловно, может быть достигнуто иным способом. Я не могу сказать, как это происходит, так как я не могу сказать, почему вы хотели сделать это из вашего вопроса. Может быть, вам будет полезно почитать над дискриминационными союзами или типами классов в справочнике по языку.

Насколько я понимаю этот вопрос. Вы хотите какое-то прологоподобное поведение. Т.е. без типизированных предикатов. В статически типизированной системе вы всегда можете добиться такого поведения, управляя этим самостоятельно. Много лет назад я видел такой пример в Turbo Prolog (они внедрили ISO-пролог в терминах Turbo/Visual 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)])).
Другие вопросы по тегам