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

Scala模式匹配将int与列表进行比较,scala,pattern-matching,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) } 我真的不明白为什么这样不行。或者我猜,我想知道如何使用case将x与head进行比较 问题在于,当您

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

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

我真的不明白为什么这样不行。或者我猜,我想知道如何使用case将x与head进行比较

问题在于,当您使用以小写字符开头的变量时,模式匹配器会认为您正在尝试分配给新变量。当然,一个仅仅是可赋值变量的模式将匹配任何内容,因此任何后续的
案例都将无法访问

要解决这个问题,您需要使用“稳定标识符”。这可以通过将小写变量放在backticks中来实现:

def isIn(x: Int, l: List[Int]): Boolean =
  l match {
    case Nil => false
    case `x` :: t => true
    case h :: t => isIn(x, t)
  }
或者重命名变量,使其以大写字符开头:

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

请注意,由于每个
案例
都必须是一个
列表
,因此您需要在
x
之后添加
:t
,以表明
x
应该与
列表的标题匹配

非常感谢您这样做了。当我读到这个回复时,我真的打了我的头。通过研究,我得到了勾号部分,但因为我没有说x应该是头或x::t,它一直给我一个错误。我觉得自己像个讨厌鬼,太谢谢你了@大卫:没问题。很高兴为您提供帮助。@David如果这对您有帮助,也许您会给出答案?我想这可能只是一个简单的案例或一个学习练习,但如果您真的只想看看列表中是否有
x
,您可以使用
l.contains(x)
(或者更安全的
l.exists(==x)
)。