我正在尝试编写一个递归程序,用于将 int 与列表中的每个值进行比较。问题是我不断收到无法访问的错误,我真的不知道为什么。我的代码是
def isIn(x : Int, l : List[Int]) : Boolean = l match {
case Nil => false
case x => true
case h :: t => isIn(x, t)
}
我真的不明白为什么这不起作用。或者我想,我想知道如何将 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)
}
我真的不明白为什么这不起作用。或者我想,我想知道如何将 x 与 head 用例进行比较。
问题是当您使用以小写字符开头的变量时,模式匹配器认为您正在尝试分配给新变量。当然,只是一个可赋值变量的模式将匹配任何东西,因此任何后续case
都将无法访问。
要解决这个问题,您需要使用“稳定标识符”。这可以通过将小写变量放在反引号中来完成:
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)
}
请注意,由于 eachcase
必须是List
,因此您需要使用:: t
afterx
来显示x
应该匹配List
.