【问题标题】:Generic types (&T) in RascalRascal 中的泛型类型 (&T)
【发布时间】:2015-02-13 15:36:11
【问题描述】:

我正在尝试使用 &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>");
            }
        }
    }
}

当我打印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 并提取这些列表中每个元素的类型。

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

谢谢!

【问题讨论】:

    标签: generics rascal


    【解决方案1】:

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

    具体而言,这意味着您在函数体内使用的模式中使用的类型变量静态绑定到它们的上限,在您的情况下:值。那么这不是一个可枚举的类型,这就是

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

    typeOf 函数返回值的动态类型,这解释了为什么您的打印工作与报告的一样。

    这是否足够详细地回答了您的问题?

    【讨论】:

    • 是的!这是完美的感谢。我今天早些时候意识到了其中的一些,并得到了一些工作。一如既往,感谢您的回复:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多