不允许在列表中使用cons; “与任何声明的(重载的)签名模式都不匹配”

时间:2013-09-25 13:46:41

标签: rascal

根据这个页面:

http://tutor.rascal-mpl.org/Rascalopedia/List/List.html

这就是你在列表中使用cons的方法:

cons(1,[2,3]); //should return [1,2,3]

在Rascal控制台中尝试这个:

import List;
cons(1,[2,3]);

给我这个错误:

|stdin:///|(1,13,<1,1>,<1,14>): The called signature: cons(int, list[int]),
does not match any of the declared (overloaded) signature patterns:
    Symbol = cons(Symbol,str,list[Symbol])
    Production = cons(Symbol,list[Symbol],set[Attr])
    Symbol = cons(Symbol,str,list[Symbol])
    Production = cons(Symbol,list[Symbol],set[Attr])

是否存在与标准导入函数和数据类型的名称冲突?

1 个答案:

答案 0 :(得分:1)

好问题。首先是一个直截了当的答案。缺点不是作为构建列表的库函数存在(它是改进类型API的一部分,意味着不同的东西)。

我们写这个:

rascal>[1, *[2,3,4]]
list[int]: [1,2,3,4]

rascal>1 + [2,3,4]
list[int]: [1,2,3,4]

rascal>[1] + [2,3,4]
list[int]: [1,2,3,4]

rascal>list[int] myList(int i) = [0..i];
list[int] (int): list[int] myList(int);

rascal>[*myList(10), *myList(20)]
list[int]: [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]

现在解释混乱。 Rascalopedia课程是关于抽象概念和术语,通常在使用Rascal时很有用。这对你来说可能太基础了。我将专注于Rascal语言和图书馆课程,以获得与Rascal编程相关的更具体的示例和信息。有关列表文字的信息,请参阅http://tutor.rascal-mpl.org/Rascal/Expressions/Values/List/List.html,列表中的库函数有http://tutor.rascal-mpl.org/Rascal/Libraries/Prelude/List/List.html

其他一些清单,用于解构而不是构建:

rascal>[1,2,3,4][1..]
list[int]: [2,3,4]

rascal>[1,2,3,4][1..2]
list[int]: [2]

rascal>[1,2,3,4][..-1]
list[int]: [1,2,3]

rascal>if ([*x, *y] := [1,2,3,4], size(x) == size(y)) println(<x,y>);
<[1,2],[3,4]>
ok

rascal>for ([*x, *y] := [1,2,3,4]) println(<x,y>);
<[],[1,2,3,4]>
<[1],[2,3,4]>
<[1,2],[3,4]>
<[1,2,3],[4]>
<[1,2,3,4],[]>