2

为什么以下工作:

rascal>int increment(int x) = x + 1;
int (int): int increment(int);

rascal>int s = 5;
int: 5

rascal>increment(s);
int: 6

rascal>value vs = s;
value: 5

rascal>increment(vs);
int: 6

...虽然这失败了:

rascal>data Side = leftSide() | rightSide();
ok

rascal>Side swap(leftSide()) = rightSide();
Side (Side): Side swap(Side);

rascal>Side swap(rightSide()) = leftSide();
Side (Side): Side swap(Side);

rascal>Side side = leftSide();
Side: leftSide()

rascal>swap(side)
Side: rightSide()

rascal>value vside = side;
value: leftSide()

rascal>swap(vside)
|stdin:///|(0,11,<1,0>,<1,11>): The called signature: swap(value),
does not match the declared signature:  Side swap(Side); (abstract pattern);  Side swap(Side); (abstract pattern);
4

1 回答 1

2

很好的问题。事实上,这是未定义的行为。当类型检查器完成时,两个版本都应该给出一个静态错误,即:“增量未完全定义在值上,仅在 int 上”和“交换未完全定义在值上,仅在 Side 上”或这种徒劳的东西。

要解决静态错误,将来,您必须添加这样的替代方法来完成请求类型的功能:

default int increment(value _) { 
  throw "??? how to increment something that is not an int???"; 
}

default Side swap(value x) { 
    throw "??? how to swap something that is not a Side???";
}

然后你会再次出现动态/运行时错误,但前提是参数分别不是动态int或 a Side;-)

请注意,这default是必需的,否则 value 参数将与静态不允许的原始定义重叠。

于 2013-12-30T09:30:08.700 回答