Scala模式匹配将int与列表进行比较

Slo*_*bro 2 scala pattern-matching

我正在尝试编写一个递归程序,用于将int与列表中的每个值进行比较.问题是我一直收到无法访问的错误,我真的不知道为什么.我的代码是

def isIn(x : Int, l : List[Int]) : Boolean = l match {
  case Nil => false
  case x => true
  case h :: t => isIn(x, t)
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么这不起作用.或者我想,我想知道如何将x与头部用例进行比较.

dhg*_*dhg 6

问题是,当您使用以小写字符开头的变量时,模式匹配器会认为您正在尝试分配给新变量.当然,只是一个可分配变量的模式将匹配任何东西,因此任何后续case都将无法访问.

要解决此问题,您需要使用"稳定标识符".这可以通过将小写变量放在反引号中来完成:

def isIn(x: Int, l: List[Int]): Boolean =
  l match {
    case Nil => false
    case `x` :: t => true
    case h :: t => isIn(x, t)
  }
Run Code Online (Sandbox Code Playgroud)

或重命名变量,使其以大写字符开头:

def isIn(X: Int, l: List[Int]): Boolean =
  l match {
    case Nil => false
    case X :: t => true
    case h :: t => isIn(X, t)
  }
Run Code Online (Sandbox Code Playgroud)

请注意,由于每个case必须是a List,因此您需要使用:: tafter x来显示x应匹配的头部List.