我必须使用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)
}
答案 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