我正在尝试使用&T概念来处理Rascal中的泛型类型。不过,有些事情我觉得有点奇怪。我不清楚为什么像下面这样的东西行不通:
private tuple[str,int] synthesise_p(Fancy::AST::Exp exp, int count) {
switch (exp) {
case &T n(&T e0, &T e1, &T e2): {
println("e0: <e0> typeOf(e0): <typeOf(e0)>\ne1: <e1> typeOf(e1): <typeOf(e1)>\ne2: <e2> typeOf(e2): <typeOf(e2)>\n");
for (ty <- e0) {
println("ty: <ty>");
}
}
}
}当我打印e0,e1和e2时
e0: ["x"] typeOf(e0): list(str()
e1: [nat(1),nat(2)] typeOf(e1): list(adt("Exp",[]))
e2: nat(3) typeOf(e2): adt("Exp",[])有以下错误:
|rascal://Synth::Synthesiser|(2291,2,<81,23>,<81,25>): value is not enumerable
?[Advice](http://tutor.rascal-mpl.org/Errors/Static/NotEnumerable/NotEnumerable.html)我真正想做的是能够在e0和e1上迭代,并提取这些列表中每个元素的类型。
我错过了什么/做错了什么?
谢谢!
发布于 2015-02-13 19:56:45
流氓式系统的原理是静态的。这可能会让人感到困惑,因为我们还没有发布静态检查器,但是解释器目前模拟静态类型系统,因为我们一直计划使用静态类型语言。
具体来说,这意味着在函数体内部使用的模式中使用的类型变量被静态地绑定到它们的上界,在您的例子中是: value。因此,这不是一个可枚举的类型,这就是为什么实现<-抱怨。如果要匹配它需要更具体的类型,如listvalue或list&T,则等效。
另外,将类型参数绑定到更多具体类型的方法是在函数标头中使用它们。然后将使用实际参数的静态类型。另一种方法是使用带有模式中可见声明的命名构造函数,以便参数位置可以分别与类型参数匹配。但是,这并不是很有用,因为如果您知道声明,也没有必要推断类型。
typeOf函数返回值的动态类型,这解释了为什么打印可以像报告的那样工作。
这个回答你的问题是否有足够的细节?
https://stackoverflow.com/questions/28503122
复制相似问题