generics - 在流氓中,泛型类型( & T )

  显示原文与译文双语对照的内容
0 0

我正在尝试使用 &T 概念在流氓中使用泛型类型。 有些事情我发现有点奇怪。 我不清楚为什么下面这样的事情将不起作用:


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>");
 }
 }
 }
}

打印 e0e1e2 时:


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)

我真正想做的是能够遍历 e0e1,并提取这些列表中每个元素的类型。

我错过了什么?

谢谢!

时间: 原作者:

0 0

rascals型系统的原理是 static 。 因为我们尚未发布 static 检查器,但是解释器目前正在模拟 static 类型系统。

具体来说,在函数内部使用的模式中使用的类型变量被静态绑定到它的上限,例如: 值。这不是一个可以枚举类型,这就是 <实现的原因。 如果想匹配它,它需要一个更具体的类型,如列表 [value] 或者列表 [&T] 。

另外,将类型参数绑定到更具体类型的方法是在函数头中使用它们。 将使用 static 类型的实际参数。 另一种方法是在 Pattern 中使用带有可见声明的命名构造函数,以便可以将参数位置分别与类型参数匹配。 虽然这不是很有用,但是如果你知道声明,则无需推断类型。

typeOf函数返回值的动态类型,这将解释为什么你的打印工作按报告的方式工作。

这个问题是否有足够的细节来回答你的问题?

...