Rascal 模式匹配中构造函数关键字参数的推断类型

Inferred types of constructor keyword parameters in Rascal pattern matches

我想我没有完全理解 Rascal 中与模式匹配相关的关键字概念(因为 Rascal 实际上支持以下符号)。假设我已经定义了一个数据类型 Exp 和一个函数 demoFun1(假设在这种情况下 z 绑定到 y):

data Exp = a(int x, int y = 5) | b(int x);
Exp demoFun1(a(x, y = z)) = b(z);

然后我执行:demoFun1(a(2, y = 3)), Rascal returns:

|stdin:///|(25,4,<1,25>,<1,29>): The called signature: b(value),
does not match the declared signature:  Exp = b(int)

(这已经是一个非常奇怪的错误消息,因为我不能在参数中说类似 int y = ... 的东西,假设这是正确的语法)。但是,如果我定义另一个函数,我假设“=”符号后的值是默认值(如 ADT 定义中的情况),我可以简单地使用 y 的值相反:

Exp demoFun2(a(x, y = 3)) = b(y);

然后我执行demoFun2(a(1, y=2))

然后是流氓returns:

|stdin:///|(0,19,<1,0>,<1,19>): The called signature: demoFun2(Exp),
does not match the declared signature:  Exp demoFun2(Exp); (abstract pattern);

是否(尚未完全)支持关键字模式匹配,或者我做错了什么?

谢谢!

首先,是的,错误信息需要改进。实际上还有另一个未报告的错误首先出现。在 Rascal 的函数头中的模式中引入的所有变量都必须有类型。解释器没有抱怨这个,因此下游有一个意想不到的结果。

这解决了您的问题,将新变量 z 注释为 int:

Exp demoFun2(a(x, y = int z)) = b(z);

话虽如此,以下代码触发了类似的问题,表明模式匹配关键字参数期间的类型推断确实有问题:

rascal>if (a(x, y = q) := xxx) q;
value: 3

鉴于 y 的声明,q 的类型应该只是 int

感谢报告,参见https://github.com/cwi-swat/rascal/issues/843