为什么scala中不允许这种匹配?

为什么scala中不允许这种匹配?,scala,Scala,我必须使用scala查找元素是否在列表中,并且只允许使用递归。为什么下面的代码不起作用,因为match语句对我来说似乎是正确的。我的IDE在所有三个case语句上都给了我一个错误,它说type,mistmatch,boolean required def isInN(x: Int, l: List[Int]): Boolean = (l,l.head) match { case Nil,_ => false case _,x => true case _,_ =>

我必须使用scala查找元素是否在列表中,并且只允许使用递归。为什么下面的代码不起作用,因为match语句对我来说似乎是正确的。我的IDE在所有三个case语句上都给了我一个错误,它说type,mistmatch,boolean required

def isInN(x: Int, l: List[Int]): Boolean = (l,l.head) match {
  case Nil,_ => false
  case _,x => true
  case _,_ => isInN (x,l.tail)
}

您正在匹配一个元组,因此需要使用适当的元组提取器。i、 e.只需添加括号:

def isInN(x: Int, l: List[Int]): Boolean = (l, l.head) match {
    case (Nil, _) => false
    case (_, x) => true
    case (_, _) => isInN (x, l.tail)
}
这可以编译,但不会像您希望的那样工作。l、 如果列表为空,head将抛出异常。而比赛中的x会急切地匹配任何东西,所以最后一种情况永远无法实现。要与标识符匹配,需要在其周围加上反勾号,否则它将只是一个占位符匹配器

要在不调用l.head的情况下使用类似的模式匹配,可以在列表本身上进行模式匹配:

尽管这一切都被标准集合库中的包含所压倒:

scala> List(1, 2, 3, 4).contains(2)
res5: Boolean = true

您正在匹配一个元组,因此需要使用适当的元组提取器。i、 e.只需添加括号:

def isInN(x: Int, l: List[Int]): Boolean = (l, l.head) match {
    case (Nil, _) => false
    case (_, x) => true
    case (_, _) => isInN (x, l.tail)
}
这可以编译,但不会像您希望的那样工作。l、 如果列表为空,head将抛出异常。而比赛中的x会急切地匹配任何东西,所以最后一种情况永远无法实现。要与标识符匹配,需要在其周围加上反勾号,否则它将只是一个占位符匹配器

要在不调用l.head的情况下使用类似的模式匹配,可以在列表本身上进行模式匹配:

尽管这一切都被标准集合库中的包含所压倒:

scala> List(1, 2, 3, 4).contains(2)
res5: Boolean = true

你应该解释一下你添加的反引号x@Dimitri反引号存在,因此scalac将其视为作为参数列出的x,而不是作为新变量。您应该解释添加的反引号x@Dimitri反引号存在,因此scalac将其视为作为参数列出的x,而不是作为一个新的变量。