函数在元素数组上获取数组和函数

时间:2013-03-11 00:13:01

标签: scala functional-programming

我开始学习Scala并在阅读Scala for the Impatient时,得到以下解决方案之一:

//No function
def positivesThenZerosAndNegatives(values: Array[Int]) = {
    Array.concat(for (value <- values if value > 0) yield value,
        for (value <- values if value == 0) yield value,
        for (value <- values if value < 0) yield value)
}

但是现在我试图将每个综合过滤器应用于过滤器的函数作为参数传递给:

//Trying to use a function (filter)
def positivesThenZerosAndNegatives2(values: Array[Int]) = {
    Array.concat(filter(values, _ > 0), filter(values, _ == 0), filter(values, _ < 0))
}

def filter[T: Int](values: Array[T], f: (T) => Boolean) = {
    for (value <- values if f(value)) yield value
}

我没有找到引用元素数组的正确方法。

1 个答案:

答案 0 :(得分:3)

您可以编写filter方法,如下所示:

import scala.reflect.ClassTag

def filter[T: ClassTag](values: Array[T], f: T => Boolean): Array[T] = {
  for(value <- values; if f(value)) yield value
}

或者这样:

def filter(values: Array[Int], f: Int => Boolean): Array[Int] = {
  for(value <- values; if f(value)) yield value
}

无论如何,你可以简单地重写你的方法positivesThenZerosAndNegatives

scala> def positivesThenZerosAndNegatives(values: Array[Int]) = {
     |   values.filter(0 <) ++ values.filter(0 ==) ++ values.filter(0 >)
     | }