pattern-matching - Rascal 中的函数模式、节点和值类型

标签 pattern-matching type-conversion rascal

为什么以下工作有效:

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);

最佳答案

很好的问题。事实上这是未定义的行为。当类型检查器完成时,两个版本都应该给出静态错误,即:“增量未在值上完全定义,仅在 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???";
}

然后你会再次遇到动态/运行时错误,但前提是参数是动态而不是intSide分别;-)

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

关于pattern-matching - Rascal 中的函数模式、节点和值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20775113/

相关文章:

c++ - 转换问题无法从 void 转换为 float C++

abstract-syntax-tree - 为什么在 Rascal 的 Java AST 中表达式是 `super()`?

runtime-error - 解析时出现CallFailed错误

java - 约束解决推断类型以重构 Java 代码

Java : How to find string patterns in a LARGE binary file?

unix - AWK 根据搜索模式打印特定行

java - Java 如何确定通过隐式类型调用调用什么方法?

java - 如何使用格式化程序将请求绑定(bind)到表单命令对象的 int 属性的空字符串 http 参数默认为 0?

java - 如何在java中连续限制超过1个&符号

haskell - 如何仅用一个函数解决此数据类型问题,最好使用模式匹配