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
。
我想我没有完全理解 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
。