为什么Scala要求模式变量是线性的?

时间:2015-11-25 14:35:21

标签: scala pattern-matching

Scala要求模式变量是线性的,即模式 变量在模式中可能不会出现多次。因此,此示例不编译:

def tupleTest(tuple: (Int, Int)) = tuple match {
  case (a, a) => a
  case _ => -1
}

但你可以使用两个模式变量和一个后卫来检查相等性:

def tupleTest(tuple: (Int, Int)) = tuple match {
  case (a, b) if a == b => a
  case _ => -1
}

那么为什么Scala要求模式变量是线性的?是否有任何不能像这样转变的案例?

修改

很容易将第一个示例转换为第二个示例(Scala转换为Scala)。在模式中出现的所有变量v中,首先获取被计算的表达式并将其分配给变量v。对于每个其他事件,引入一个名称未在当前范围中使用的新变量。对于每个变量v',添加一个后卫v == v'。它与程序员的行为方式相同(=>效率相同)。这种方法有什么问题吗?我希望看到一个无法像这样转变的例子。

1 个答案:

答案 0 :(得分:0)

因为case (a, b)基本上将val a分配给_._1val b分配给_._2(至少您可以这样查看)。如果是case (a, a),则无法将val a分配给_._1_._2

实际上你想做的事情看起来像是

case (a, `a`) => ???

因为scala使用反引号来匹配标识符。但遗憾的是,由于仅在a之后才给出=>的可见性,但仍然不起作用(虽然会很有趣,但我也讨厌写case (a, b) if a = b =>)。其原因可能仅仅是因为编写支持

的编译器更难