匹配方程式案例的 Scala 模式

Scala pattern matching an equation case

如果 x 可以被 y 整除,我想进行模式匹配,return 是的,但我似乎语法错误并且一直崩溃。

def isDivisible (x: Int, y: Int) :Boolean = Int match {
    case (x % y == 0) => true
    case _ => false
}

isDivisible(10, 5)

将方程式作为案例的正确方法是什么

在这样一个简单的例子中使用模式匹配有点矫枉过正,只需定义:

def isDivisible(x: Int, y: Int): Boolean = x % y == 0

扩展其中一条评论,为了直接解决您的问题,您需要按如下方式进行模式匹配:

def isDivisible(x: Int, y: Int): Boolean = (x, y) match {
  case (a, b) if a % b == 0 => true
  case _ => false
}

isDivisible(10, 5)

您需要对单个值进行模式匹配,因此我们首先需要将 xy 包装成一个 元组 (x, y).

第一个 case 语句然后需要从 元组 中提取值,并且有一个 if 子句来确定第一个值(a,映射到 x 的值)可以被第二个值(b,映射到 y 的值)整除。

如果 if 子句成功,则函数将 return true;否则,它将 return false.

显然,在这种特殊情况下使用模式匹配在编码和执行资源方面效率低下。这是因为将参数包装到一个元组中,然后对一个元组进行模式匹配并再次将其分开,是完全多余的。我们可以直接用 if 语句替换它:

def isDivisible(x: Int, y: Int): Boolean = if(x % y == 0) true else false

isDivisible(10, 5)

然而,由于if语句中条件的值映射到相同的结果,这也是多余的,我们可以将if替换为条件:

def isDivisible(x: Int, y: Int): Boolean = x % y == 0

isDivisible(10, 5)

或者,您可以对模数计算的结果进行模式匹配:

def isDivisible(x: Int, y: Int): Boolean = x % y match {
  case 0 => true
  case _ => false
}

isDivisible(10, 5)

但是请注意,如果 y 为 0,则此函数的所有上述版本都将失败并返回 ArithmeticException。您可以使用模式匹配来处理这种情况:

def isDivisible(x: Int, y: Int): Boolean = y match {
  case 0 => false // Treat division by zero as indivisible.
  case _ => x % y == 0
}

isDivisible(10, 0)