无限制变量名称在水星中的声明
我想在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
的东西。
值的数量不受限制,名称也不固定。
上午在水星,所以我需要一些帮助。
谢谢
你直接要求什么,根本无法做到。鉴于
:- 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阅读中受益。
不正确。您可以声明特定的字符串类型实例,以防止谓词失败。例如: - inst foo == bound(“x”;“y”;“z”)。 : - func bar(string :: in(foo))=(int :: out)det。当然这很奇怪,但它会完成OP所要的(我认为)。 – 2011-12-17 05:28:15
正如其他人所说,这是在水星根本不可能的 - 这是故意的。
如果你想表达一种你可能虽然想要什么,:V1 V2 V3 ...等是:
:- type my_type
----> v(int).
:- func name(my_type) = string.
name(v(Num)) = formst("v%d", [i(Num)]).
类型表示所有整数v和函数名可以用于这种类型的'漂亮'值。
据我了解这个问题。你需要一些类似Prolog的行为。 I.e没有键入谓词。在静态类型系统中,您总是可以通过自己处理这些行为来实现这种行为。很久以前,我在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)])).
你是什么意思的“第二时间”吗?你的意思是你想重新定义myplayer,还是你想在第二次使用时使用其值的不同子集?此外,更大的上下文是什么 - 听起来你可能想要一个参数类型或类型类,但我不确定没有上下文。 – 2011-12-16 18:41:28