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

时间:2015-02-04 21:35:59

标签: scala

我必须使用scala查找元素是否在列表中,并且我只允许使用递归。为什么下面的代码不起作用,因为匹配语句似乎对我来说是正确的。我的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)
}

1 个答案:

答案 0 :(得分:8)

您正在匹配元组,因此您需要使用正确的元组提取器。即只需添加括号:

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中的match会热切地匹配任何内容,因此永远无法达到最后的case。要匹配标识符,您需要用反引号将其包围,否则它只是一个占位符匹配器。

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

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

虽然标准集合库中的contains完全胜过:

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