我想我并不完全理解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);
关键字上的模式匹配是否(尚未完全)支持,或者我做错了什么?
谢谢!
答案 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
。