2

寻求帮助为导入或输出列表的谓词声明 pred。我试过:- pred name(list::in, integer::out) 是多的。并且编译器错误消息说 list/0 无法识别。检查了库模块列表,发现我应该写类似 ...(list(T)::in . . . ) 的东西,但不完全明白该怎么做。

4

2 回答 2

3

List 是参数类型,参数类型接受一个或多个参数。在列表的情况下,参数说明这是一个列表。您可能有一个数字列表、一个字符串列表、一个南瓜列表或一个数字列表(任何有效类型)。因此,如果我创建一个函数,例如:

:- func max(list(int)) = int.

这个函数接受一个整数列表并返回一个整数(在列表中找到的最大数)。

那么,列表(T)是什么?以大写字母开头的标记是变量,即使在类型中,它也可以代表任何其他类型(通常)。所以“list(T)”表示任何东西的列表,例如数字或字符串的列表。下一个谓词是多态的,它适用于不同的类型,具体取决于它的类型变量的实际值。

:- pred first(list(T)::in, T::out) is semidet.

可以传递任何内容的列表,因为列表中的第一项将被返回,如果有的话。如果这与字符串列表“list(string)”一起使用,那么 T 将被替换为(在编译期间)“string”。

Mercury 类型系统的这一部分的参考资料在这里。 http://www.mercurylang.org/information/doc-release/mercury_ref/Discriminated-unions.html#Discriminated-unions

于 2014-11-28T05:04:20.053 回答
0

我已经尝试过:- pred name(...list(T),....) is ... 并且编译器不再报告与我的 pred 声明相关的错误。还不知道结果是否正确,但更近了一步。

于 2014-11-26T20:03:55.240 回答