在Scala的模式匹配系统中使用比较符(Using comparison operators in

2019-08-20 01:40发布

是否有可能匹配在Scala中使用模式匹配系统的比较? 例如:

a match {
    case 10 => println("ten")
    case _ > 10 => println("greater than ten")
    case _ => println("less than ten")
}

第二个case语句是非法的,但我想可以指定“当一个大于”。

Answer 1:

您可以添加保护,即一个if和图案后一个布尔表达式:

a match {
    case 10 => println("ten")
    case x if x > 10 => println("greater than ten")
    case _ => println("less than ten")
}

编辑:请注意,这不是表面上的不同更多地把一个if 以后 =>因为如果保护是不正确的模式将不匹配。



Answer 2:

作为一个非问题的答案的精神,问如何将谓词成match子句,在这种情况下,谓词可以在之前被分解出来match

def assess(n: Int) {
  println(
    n compare 10 match {
      case 0 => "ten"
      case 1 => "greater than ten"
      case -1 => "less than ten"
    })
}

现在, 对于文档scala.math.Ordering.compare(T, T)只是保证不相等的结果将是大于小于零 。 Java的Comparable#compareTo(T)同样指定Scala的。 这恰好是传统的分别使用1和-1的正值和负值,如Scala的当前实现的做法,但一个不能作这样的假设,而不从下面变幻出实施的一些风险。



Answer 3:

一个解决方案,在我看来是比增加卫士更可读:

(n compare 10).signum match {
    case -1 => "less than ten"
    case  0 => "ten"
    case  1 => "greater than ten"
}

笔记:

  • Ordered.compare返回一个负整数,如果这是小于,正如果更大,并且0如果相等。
  • Int.signum压缩输出从compare-1为负数(小于10), 1为正(大于10),或0为零(等于10)。


Answer 4:

虽然所有上述波纹管和完美的答案回答原来的问题,一些额外的信息可以在文档中找到https://docs.scala-lang.org/tour/pattern-matching.html ,他们不适合我的情况下,但由于这个计算器的答案是第一个建议在谷歌,我想张贴我的答案是上面的问题的一个极端例子。
我的问题是:

  • 如何使用在比赛表达保护与函数的参数?

这可以解释:

  • 如何使用,如果在比赛表达式语句与函数的参数?

答案是下面的代码示例:

    def drop[A](l: List[A], n: Int): List[A] = l match {
      case Nil => sys.error("drop on empty list")
      case xs if n <= 0 => xs
      case _ :: xs => drop(xs, n-1)
    }

连结阶小提琴: https://scalafiddle.io/sf/G37THif/2如可以看到case xs if n <= 0 => xs语句是能够使用正(函数的参数)与所述保护装置(如果)语句。

我希望这可以帮助我这样的人。



文章来源: Using comparison operators in Scala's pattern matching system