2011-12-16 48 views
2

我想在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

你是什么意思的“第二时间”吗?你的意思是你想重新定义myplayer,还是你想在第二次使用时使用其值的不同子集?此外,更大的上下文是什么 - 听起来你可能想要一个参数类型或类型类,但我不确定没有上下文。 – 2011-12-16 18:41:28

回答

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 unionstypeclasses阅读中受益。

+2

不正确。您可以声明特定的字符串类型实例,以防止谓词失败。例如: - inst foo == bound(“x”;“y”;“z”)。 : - func bar(string :: in(foo))=(int :: out)det。当然这很奇怪,但它会完成OP所要的(我认为)。 – 2011-12-17 05:28:15

2

正如其他人所说,这是在水星根本不可能的 - 这是故意的。

如果你想表达一种你可能虽然想要什么,:V1 V2 V3 ...等是:

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

:- func name(my_type) = string. 

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

类型表示所有整数v和函数名可以用于这种类型的'漂亮'值。

1

据我了解这个问题。你需要一些类似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)])).