【问题标题】:Scala Pattern Matching comparing a int to a listScala模式匹配将int与列表进行比较
【发布时间】:2012-09-04 19:09:48
【问题描述】:

我正在尝试编写一个递归程序,用于将 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 用例进行比较。

【问题讨论】:

  • 我想这可能只是一个简化的案例或一个学习练习,但如果你真的只是想看看x是否在列表中,你可以使用l.contains(x)(或者稍微多一点输入安全l.exists(_ == x))。

标签: scala pattern-matching


【解决方案1】:

问题在于,当您使用以小写字符开头的变量时,模式匹配器会认为您正在尝试分配给新变量。当然,只是一个可赋值变量的模式将匹配任何东西,因此任何后续的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)
  }

请注意,由于每个case 都必须是List,因此您需要在x 之后加上:: t,以表明x 应该与List 的头部匹配。

【讨论】:

  • 非常感谢您这样做。当我读到这个回复时,我老实说我的头。通过研究,我得到了勾选部分,但因为我没有说 x 应该是头部或 x::t 它一直给我一个错误。我觉得自己像个 dingbat 非常感谢你!
  • @David:没问题。很高兴能提供帮助。
  • @David 如果这对你有帮助,也许你会accept 回答?
猜你喜欢
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多