我有以下代码:
val ls = List(0, -1, 2, -2)
var removeNegative = List[Int]()
def removeNegative(ls: List[Int]): Int = ls match {
case Nil => 0
case l::for(ls <- ls){
var removeNegative = List[Int]()
if(ls >= 0){
removeNegative = removeNegative :+ ls
}
}
return removeNegative
}
println(removeNegative(ls)
并且我将函数主体中的代码用作独立代码,并且可以正常工作,但是我不得不将其添加到函数中,并且出现以下错误:
ScalaFiddle.scala:7: error: illegal start of simple pattern
case l::for(ls <- ls){
^
ScalaFiddle.scala:16: error: '=>' expected but '}' found.
}
^
我在这里做错了什么?
答案 0 :(得分:1)
解构列表时无效的模式匹配。
请参阅下面的代码片段,以了解更多惯用的方法。
val ls = List(0, -1, 2, -2)
def removeNegative(ls: List[Int]):List[Int] = ls match {
case Nil => ls
case l::tail =>
if (l < 0) l :: removeNegative(tail) else removeNegative(tail)
}
答案 1 :(得分:0)
实现所需功能的最简单方法是使用filter
def removeNegative(xs: List[Int]): List[Int] = xs.filter(_ >= 0)
val ls = List(0, -1, 2, -2)
removeNegative(ls) // List(0, 2)
如果要递归版本:
def removeNegative(xs: List[Int], ans: List[Int] = List.empty[Int]): List[Int] = xs match {
// case when there is no elements left in xs
case Nil => ans
// we get first element of xs and
// if it is non-negative, append it to ans
case x::tail => removeNegative(tail, if (x < 0) ans else ans:+x)
}
val ls = List(0, -1, 2, -2)
removeNegative(ls) // List(0, 2)
它是尾部递归,这意味着它不会为每个递归调用消耗堆栈。
如果您想进一步了解尾递归 here是一个好的开始说明。