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.

值的数量不受限制,名称也不固定。

我是水星的新手。

4

3 回答 3

2

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

但是,如果您想要一种表示: v1 v2 v3... 等的类型,您可能想要的是:

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

:- func name(my_type) = string.

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

该类型表示所有整数的 v,并且函数名称可用于“漂亮打印”此类型的值。

于 2011-12-17T00:39:51.530 回答
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)])).
于 2013-01-02T07:41:01.127 回答
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"]]问题库的字符串列表。

你所要求的无法完成。然而,你真正想要做的——你认为“可变数量的类型”将是一个有用的手段——当然可以通过其他方式来完成。我不知道那是什么方式,因为我不知道你为什么要从你的问题中这样做。也许您会从阅读语言参考中的有区别的联合类型类中受益。

于 2011-12-16T21:51:12.883 回答