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

时间:2015-07-30 01:07:30

标签: keyword rascal

我想我并不完全理解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返回:

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

(这已经是一个非常奇怪的错误消息,因为我不能在参数中说int y = ...之类的东西,假设这是正确的语法)。但是,如果我定义另一个函数,而我假设&#34; =&#34; -sign之后的值是默认值(就像ADT定义中的情况一样),我可以简单地使用该值改为y

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

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

然后Rascal回归:

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

这可以解决您的问题,使用z注释新变量int

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

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

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

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

感谢您提供报告,请参阅https://github.com/cwi-swat/rascal/issues/843