如何在Scala中编写函数

时间:2019-05-22 13:45:04

标签: scala

我有以下代码:

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.
  }
  ^

我在这里做错了什么?

2 个答案:

答案 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是一个好的开始说明。