Неограниченная декларация имени переменной в ртути
Я хотел бы объявить тип данных в 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)])).