【问题标题】:Unrestricted variable name declaration in MercuryMercury 中不受限制的变量名声明
【发布时间】:2012-01-21 17:52:01
【问题描述】:

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

值的个数不限,名称也不固定。

我是 Mercury 的新手。

【问题讨论】:

  • “第二次”是什么意思?您的意思是要重新定义 myplayer,还是要在第二次使用时使用其值的不同子集?另外,更大的上下文是什么——听起来你可能想要一个参数类型或类型类,但我不确定没有上下文。

标签: mercury


【解决方案1】:

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

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

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

:- func name(my_type) = string.

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

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

【讨论】:

    【解决方案2】:

    你直接要求的,根本做不到。给定

    :- 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 可能会对您有所帮助。

    【讨论】:

    • 不正确。您可以声明字符串类型的特定实例化以防止谓词失败。例如:- inst foo == bound("x"; "y"; "z")。 :- func bar(string::in(foo)) = (int::out) 是 det。当然这是奇怪,但它会完成(我认为)OP想要的。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      相关资源
      最近更新 更多