首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rascal中的泛型(&T)

Rascal中的泛型(&T)
EN

Stack Overflow用户
提问于 2015-02-13 15:36:11
回答 1查看 156关注 0票数 1

我正在尝试使用&T概念来处理Rascal中的泛型类型。不过,有些事情我觉得有点奇怪。我不清楚为什么像下面这样的东西行不通:

代码语言:javascript
复制
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

代码语言:javascript
复制
e0: ["x"] typeOf(e0): list(str()
e1: [nat(1),nat(2)] typeOf(e1): list(adt("Exp",[]))
e2: nat(3) typeOf(e2): adt("Exp",[])

有以下错误:

代码语言:javascript
复制
|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上迭代,并提取这些列表中每个元素的类型。

我错过了什么/做错了什么?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-13 19:56:45

流氓式系统的原理是静态的。这可能会让人感到困惑,因为我们还没有发布静态检查器,但是解释器目前模拟静态类型系统,因为我们一直计划使用静态类型语言。

具体来说,这意味着在函数体内部使用的模式中使用的类型变量被静态地绑定到它们的上界,在您的例子中是: value。因此,这不是一个可枚举的类型,这就是为什么实现<-抱怨。如果要匹配它需要更具体的类型,如listvalue或list&T,则等效。

另外,将类型参数绑定到更多具体类型的方法是在函数标头中使用它们。然后将使用实际参数的静态类型。另一种方法是使用带有模式中可见声明的命名构造函数,以便参数位置可以分别与类型参数匹配。但是,这并不是很有用,因为如果您知道声明,也没有必要推断类型。

typeOf函数返回值的动态类型,这解释了为什么打印可以像报告的那样工作。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28503122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档