在Rascal中,说我有密码:
value x = 2;
data Exp = con(int n);是否有一种方法来调用con(x),而x是一个值(但实际上是一个整数),而不事先知道con的第一个参数应该是什么类型(因此没有显式地将其转换为int)?
为什么可以调用一个函数,比如something( into )= n,将一个整数定义为一个值(例如,值y= 2)传递给它的第一个参数,而当我试图对用户定义的ADT执行同样的操作时,它却给了我一个错误?
发布于 2015-07-25 16:12:42
当您在Rascal中调用一个函数时,它实际上是对参数执行模式匹配。因此,如果您定义了int something(int n) = n;,然后调用something(x),它将x与int n匹配,看到x实际上是一个int (因此它可以将值绑定到n),并调用该函数。
如果要定义value x = 2.5,然后调用something(x),则会得到一个错误,因为它不能将值2.5绑定到int n。您可以使用第二个定义重载something,这个定义使用的是一个真实的定义,比如int something(real r) = toInt(r);,然后它就可以工作了。但是,这里有两项需要注意:在这两种情况下,something都需要返回相同的类型,您需要导入util::Math才能访问toInt。
当您使用构造函数(如con(x) )时,它不会自动为您进行模式匹配。您给它的类型必须与它期望的类型匹配。如果您知道x将始终是一个int,那么最好将其声明为int。另一种选择是创建一个像Exp makeCon(int n) = con(n);这样的函数,然后您可以随意使用它,即Exp myExp = makeCon(x);。在这种情况下,最好包含函数的默认版本,以防您给它一些意外的东西,比如default Exp makeCon(value x) { throw "Unexpected value <x>"; },这样如果您尝试用不是int的东西创建一个con,您就会得到一个可以处理的错误,可以创建自己的错误消息,添加额外的错误处理而只显示一条消息,查看导致问题的值等等,而不是让解释器给出一个错误(这可能不会给出您想要的所有信息)。
https://stackoverflow.com/questions/31628214
复制相似问题