我想在Mercury中声明一个可以包含可变数量的值和名称的数据类型。例如:
type goal ---> pick; give; come.
有三个变量/值。
我想要类似的东西:
type myplayer ---> de value declaration here.
不限制或修复变量的数量。
所以我可以使用myplayer来声明像v1, v2, v3 and v4.
这样的值/变量第二次我可以使用它来表达类似:a, b, c, d, e, z, aa, ab and az
之类的内容。
值的数量不受限制,名称也不固定。
水星新手,所以我需要一些帮助。
感谢
答案 0 :(得分:2)
正如其他人所说,这在水星中根本不可能 - 这是故意的。
你可能想要的是,如果你想要一个表达的类型:v1 v2 v3 ......等等:
:- type my_type
----> v(int).
:- func name(my_type) = string.
name(v(Num)) = formst("v%d", [i(Num)]).
该类型表示所有整数的v,函数名称可用于“漂亮打印”此类型的值。
答案 1 :(得分: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"]]
。
你要求的是无法做到的。但是,你真正想做的事情 - 你认为'可变数量的类型'的结束将是一个有用的手段 - 肯定可以通过其他方式完成。我不知道是什么方式,因为我不知道为什么你想从你的问题中做到这一点。也许您可以通过阅读语言参考中的discriminated unions或typeclasses来获益。
答案 2 :(得分: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)])).